문제
TCL의 스레드간에 두 가지 방법으로 통신해야하며, 내가 얻을 수있는 것은 유일한 마스터-> 도우미 커뮤니케이션 채널로 전달되는 매개 변수가있는 한 가지 방법입니다. 다음은 다음과 같습니다.
proc ExecProgram { command } {
if { [catch {open "| $command" RDWR} fd ] } {
#
# Failed, return error indication
#
error "$fd"
}
}
예를 들어 execprogram "tclsh83 testcases.tcl testcase_01"과 같은 tclsh83을 호출하려면
TestCases.tcl 파일 내에서 정보에 전달 된 것을 사용할 수 있습니다. 예를 들어:
set myTestCase [lindex $argv 0]
TestCases.tcl 내에서 파이프에 넣을 수 있습니다.
puts "$myTestCase"
flush stdout
프로세스 ID를 사용하여 마스터 스레드 내에 넣는 것을받습니다.
gets $app line
... 루프 내에서.
그다지 좋지 않습니다. 그리고 양방향이 아닙니다.
2 스레드 사이의 Windows에서 TCL에 대한 쉬운 2 방향 통신 방법을 아는 사람이 있습니까?
해결책
다음은 두 프로세스가 어떻게 통신 할 수 있는지 보여주는 작은 예입니다. 먼저 아동 프로세스 (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에는 적절한 판간 통신을 허용하는 스레딩 확장 기능이 있습니다.