문제

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에는 적절한 판간 통신을 허용하는 스레딩 확장 기능이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top