TCL: communication bidirectionnelle entre les threads sous Windows

StackOverflow https://stackoverflow.com/questions/267420

  •  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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top