TCL: двусторонняя связь между потоками в Windows

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

  •  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 имеет потоковое расширение, которое обеспечивает правильную связь между потоками.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top