TCL: двусторонняя связь между потоками в Windows - PullRequest
4 голосов
/ 06 ноября 2008

Мне нужно иметь двухстороннюю связь между потоками в Tcl, и все, что я могу получить, - это один путь с передачей параметров в качестве моего единственного главного канала связи помощника. Вот что у меня есть:

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 между двумя потоками?

1 Ответ

4 голосов
/ 06 ноября 2008

Вот небольшой пример, который показывает, как два процесса могут взаимодействовать. Сначала запустите дочерний процесс (сохраните его как 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 имеет потоковое расширение, которое обеспечивает правильную связь между потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...