TCL: Zwei-Wege-Kommunikation zwischen Threads in Windows
-
06-07-2019 - |
Frage
Ich brauche zwei-Wege-Kommunikation zwischen Threads in Tcl haben und alles, was ich bekommen kann, ist eine Möglichkeit, mit den Parametern in als meinen einzigen Master-> Helfern Kommunikationskanal vorbei. Hier ist, was ich habe:
proc ExecProgram { command } {
if { [catch {open "| $command" RDWR} fd ] } {
#
# Failed, return error indication
#
error "$fd"
}
}
die tclsh83 aufzurufen, zum Beispiel ExecProgram "tclsh83 testCases.tcl TestCase_01"
In der testCases.tcl Datei kann ich das in Informationen weitergegeben verwenden. Zum Beispiel:
set myTestCase [lindex $argv 0]
Innerhalb testCases.tcl kann ich lösche auf das Rohr:
puts "$myTestCase"
flush stdout
Und erhalten das setzt innerhalb des Master-Faden durch die Prozess-ID mit:
gets $app line
... innerhalb einer Schleife.
Was ist nicht sehr gut. Und nicht zwei-Wege.
Wer weiß, ein einfachen 2-Wege-Kommunikationsverfahren für tcl in Windows zwischen 2 Fäden?
Lösung
Hier ist ein kleines Beispiel, das zeigt, wie zwei Prozesse miteinander kommunizieren können. Zunächst einmal das Kind Prozess (speichern diese als child.tcl):
gets stdin line
puts [string toupper $line]
und dann der übergeordnete Prozess, der das Kind und comunicates damit beginnt:
set fd [open "| tclsh child.tcl" r+]
puts $fd "This is a test"
flush $fd
gets $fd line
puts $line
Die Mutter verwendet den Wert von Open zurück zum Senden und Empfangen von Daten zu / von dem untergeordneten Prozess; + R-Parameter zu öffnen öffnet die Pipeline für beide lesen und schreiben.
Die Spülung ist erforderlich, da der Puffer an der Pipeline; es ist möglich, dies zu Zeile Pufferung zu ändern, um den fconfigure Befehl.
Nur ein anderer Punkt; auf den Code der Suche verwenden Sie keine Threads hier Sie ein Kind-Prozess beginnen. Tcl hat ein Gewinde-Erweiterung, die richtige interthread Kommunikation zulässt.