2008-11-06 3 views
4

Мне нужно иметь двухстороннюю связь между потоками в Tcl, и все, что я могу получить, - это один из способов передачи параметров в качестве моего единственного канала связи master-> helper. Вот что у меня есть:TCL: Двухсторонняя связь между потоками в Windows

proc ExecProgram { command } { 
    if { [catch {open "| $command" RDWR} fd ] } { 
     # 
     # Failed, return error indication 
     # 
     error "$fd" 
    } 
} 

Для вызова tclsh83, например ExecProgram «tclsh83 testCases.tcl TestCase_01»

Внутри файла testCases.tcl я могу использовать, который прошел в информации. Например:

set myTestCase [lindex $argv 0] 

В testCases.tcl может тушит к трубе:

puts "$myTestCase" 
flush stdout 

И получает, что ставит в главном потоке, используя идентификатор процесса:

gets $app line 

... внутри цикла.

Это не очень хорошо. И не в двух направлениях.

Кто-нибудь знает простой способ двусторонней связи для tcl в Windows между двумя потоками?

ответ

4

Вот небольшой пример, показывающий, как могут взаимодействовать два процесса. Во-первых дочернего процесса (за исключением, как это child.tcl):

gets stdin line 
puts [string toupper $line] 

, а затем родительский процесс, который начинается ребенка и comunicates с ним:

set fd [open "| tclsh child.tcl" r+] 

puts $fd "This is a test" 
flush $fd 

gets $fd line 
puts $line 

Родитель использует значение, возвращаемое открытым отправлять и получать данные в/из дочернего процесса; параметр r + для открытия открывает конвейер для чтения и записи.

Флеш необходим из-за буферизации на трубопроводе; это можно изменить для буферизации строк с помощью команды fconfigure.

Просто еще один пункт; глядя на ваш код, вы не используете потоки здесь, вы начинаете дочерний процесс. Tcl имеет расширение для потоковой передачи, которое обеспечивает надлежащую межточную связь.

+0

Отлично! Он работает так же, как вы сказали. – Fraser 2008-11-07 01:42:24

Смежные вопросы