2008-11-06 6 views
4

Je dois avoir une communication bidirectionnelle entre les threads dans Tcl et tout ce que je peux obtenir est un chemin avec des paramètres passant en tant que mon seul canal de communication maître-> helper. Voici ce que j'ai:TCL: Communication bidirectionnelle entre les threads dans Windows

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 ce passé dans l'information. Par exemple:

set myTestCase [lindex $argv 0] 

Dans testCases.tcl je peux met hors du tuyau:

puts "$myTestCase" 
flush stdout 

Et recevez qui place dans le thread maître en utilisant l'ID de processus:

gets $app line 

... dans une boucle.

Ce qui n'est pas très bon. Et pas à deux voies. Quelqu'un connaît une méthode de communication bidirectionnelle facile pour tcl dans Windows entre 2 threads?

Répondre

4

Voici un petit exemple qui montre comment deux processus peuvent communiquer. Tout d'abord le processus de l'enfant (enregistrer comme child.tcl):

gets stdin line 
puts [string toupper $line] 

, puis le processus parent qui commence l'enfant et comunicates avec elle:

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 retournée par ouverture envoyer et recevoir des données depuis/vers le processus fils; le paramètre r + à ouvrir ouvre le pipeline pour lire et écrire.

La chasse d'eau est nécessaire en raison de la mise en mémoire tampon sur la canalisation; il est possible de changer cela en bufferisation de ligne en utilisant la commande fconfigure.

Juste un autre point; En regardant votre code, vous n'utilisez pas de threads ici vous démarrez un processus enfant. Tcl a une extension de thread qui permet des communications inter-thread appropriées.

+0

Parfait! Cela fonctionne comme vous l'avez dit. – Fraser

Questions connexes