TCL: communication bidirectionnelle entre les threads sous Windows
-
06-07-2019 - |
Question
Il me faut une communication à double sens entre les threads de Tcl et tout ce que je peux obtenir, c’est un sens, les paramètres étant mon seul canal de communication maître / assistant. Voici ce que j'ai:
proc ExecProgram { command } {
if { [catch {open "| $command" RDWR} fd ] } {
#
# Failed, return error indication
#
error "$fd"
}
}
Pour appeler le tclsh83, par exemple ExecProgram "tclsh83 testCases.tcl TestCase_01"
Dans le fichier testCases.tcl, je peux utiliser les informations transmises. Par exemple:
set myTestCase [lindex $argv 0]
Dans testCases.tcl, je peux écrire:
puts "$myTestCase"
flush stdout
Et recevoir ce contenu dans le fil principal à l'aide de l'ID de processus:
gets $app line
... dans une boucle.
Ce qui n’est pas très bon. Et pas dans les deux sens.
Quelqu'un connaît-il une méthode simple de communication bidirectionnelle pour tcl sous Windows entre 2 threads?
La solution
Voici un petit exemple qui montre comment deux processus peuvent communiquer. Commencez par le processus enfant (enregistrez ceci sous le nom enfant.tcl):
gets stdin line
puts [string toupper $line]
puis le processus parent qui démarre l'enfant et communique avec lui:
set fd [open "| tclsh child.tcl" r+]
puts $fd "This is a test"
flush $fd
gets $fd line
puts $line
Le parent utilise la valeur renvoyée par open pour envoyer et recevoir des données vers / depuis le processus enfant; le paramètre r + à ouvrir ouvre le pipeline à la fois en lecture et en écriture.
Le vidage est requis en raison de la mise en mémoire tampon du pipeline; il est possible de changer ceci pour mettre la mise en mémoire tampon en ligne en utilisant la commande fconfigure.
Juste un autre point; En regardant votre code, vous n'utilisez pas de threads, vous démarrez un processus enfant. Tcl a une extension de threading qui permet une communication inter-thread correcte.