TCL: двусторонняя связь между потоками в Windows
-
06-07-2019 - |
Вопрос
Мне нужно иметь двухстороннюю связь между потоками в Tcl, и все, что я могу получить, - это один путь с передачей параметров в качестве моего единственного вспомогательного канала связи master->. Вот что у меня есть:
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 между двумя потоками?
Решение
Вот небольшой пример, который показывает, как два процесса могут взаимодействовать. Сначала запустите дочерний процесс (сохраните его как child.tcl):
gets stdin line
puts [string toupper $line]
а затем родительский процесс, который запускает дочерний процесс и связывается с ним:
set fd [open "| tclsh child.tcl" r+]
puts $fd "This is a test"
flush $fd
gets $fd line
puts $line
Родитель использует значение, возвращаемое open, для отправки и получения данных в / из дочернего процесса; открываемый параметр r + открывает конвейер как для чтения, так и для записи.
Сброс необходим из-за буферизации в конвейере; это можно изменить на строковую буферизацию с помощью команды fconfigure.
Еще один момент; глядя на ваш код, вы не используете потоки, здесь вы запускаете дочерний процесс. Tcl имеет потоковое расширение, которое обеспечивает правильную связь между потоками. Р>