TCL: comunicazione bidirezionale tra thread in Windows
-
06-07-2019 - |
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?
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.