Domanda

Devo avere una comunicazione bidirezionale tra i thread in Tcl e tutto quello che posso ottenere è un modo con i parametri che passano come il mio unico canale di comunicazione helper master. Ecco quello che ho:

proc ExecProgram { command } {
    if { [catch {open "| $command" RDWR} fd ] } {
        #
        # Failed, return error indication
        #
        error "$fd"
    }
}

Per chiamare tclsh83, ad esempio ExecProgram " tclsh83 testCases.tcl TestCase_01 "

All'interno del file testCases.tcl posso usare le informazioni passate. Ad esempio:

set myTestCase [lindex $argv 0] 

All'interno di testCases.tcl posso mettere in pipe:

puts "$myTestCase"
flush stdout

E ricevi ciò che inserisce nel thread principale usando l'ID processo:

gets $app line

... all'interno di un ciclo.

Che non è molto buono. E non a doppio senso.

Qualcuno sa di un semplice metodo di comunicazione a 2 vie per tcl in Windows tra 2 thread?

È stato utile?

Soluzione

Ecco un piccolo esempio che mostra come due processi possono comunicare. Prima di tutto il processo figlio (salvalo come child.tcl):

gets stdin line
puts [string toupper $line]

e quindi il processo genitore che avvia il figlio e comunica con esso:

set fd [open "| tclsh child.tcl" r+]

puts $fd "This is a test"
flush $fd

gets $fd line
puts $line

Il genitore utilizza il valore restituito da open per inviare e ricevere dati da / verso il processo figlio; il parametro r + da aprire apre la pipeline sia in lettura che in scrittura.

Il flush è richiesto a causa del buffering sulla pipeline; è possibile cambiarlo in buffering di linea usando il comando fconfigure.

Solo un altro punto; guardando il tuo codice non stai usando le discussioni qui stai iniziando un processo figlio. Tcl ha un'estensione threading che consente comunicazioni interthread appropriate.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top