2012-08-30 3 views
2

저는 tcl을 처음 사용합니다. 백그라운드에서 계속 호출해야하는 스레드를 tcl에 만들고 싶습니다.tcl에서 스레드를 만드는 법 8.4

#!/usr/bin/env tclsh 

set serPort [open "/dev/ttyS0" RDWR] 

fconfigure $serPort -mode 115200,n,8,1 -blocking 0 

while { 1 } { 
set data [gets $chan] 
puts $data 

} 

나는 루프 동안 위를 사용하지 않도록하고, while 루프 내부의 기능을 반복 스레드를 만들려고합니다. 기본적으로 내 컴퓨터의 COM1을 장치에 연결하고 장치에서 직렬 데이터를 가져 오는 중입니다. 그러나 포트에 데이터가 없으면 "eof"명령을 사용하더라도 여전히 루프에서 빠져 나오지 않습니다. 그게 내가 스레드를 만들고 싶은 이유입니다.

나는 그것을 위해 Tcl_CreateThread을 사용할 계획입니다하지만 난 그게

답변

5

그렇게하지 마십시오 사용하는 방법을 이해하지 않습니다. 대신 비 블로킹 채널로 작업 할 때는 일반적인 Tcl의 관용구를 사용하십시오. "채널 읽기 가능"이벤트에 대한 핸들러를 설정하고 이벤트 루프를 입력하십시오. 장치가 열어 둔 포트로 데이터를 보내면 OS는 데이터를 응용 프로그램에 전달하고 콜백이 호출됩니다.

개념을 설명하기위한 최소한의 프로그램은 다음과 같습니다

proc my_read_handler ch { 
    set data [read $ch] 
    if {[eof $ch]} { 
     close $ch 
     set ::forever done ;# this makes the call to `vwait` below to quit 
     return 
    } 
    # Otherwise process the data here ... 
} 

set serPort [open "/dev/ttyS0" RDWR] 

fconfigure $serPort -mode 115200,n,8,1 -blocking no 
fileevent $serPort readable [list my_read_handler $serPort] 

vwait ::forever ;# the program enters the event loop here 

in the examples에 더 읽기.

몇 가지 관찰 :

  • 원격 측이 닫힐 때 EOF 만 발생합니다. 채널에 close 번으로 전화하면이 경우 '읽을 수있는'코드도 호출되지 않습니다.
  • Tk 애플리케이션을 작성하는 경우 이미 이벤트 루프가 있으므로 에 대한 호출이 필요하지 않습니다 (또한 이벤트 루프를 다시 입력하므로 매우주의해야합니다). 예를 들어 사용자가 버튼을 클릭 할 때 실행되는 코드에서 장치를 열면 획득 한 채널에서 읽을 수있는 콜백을 설정 한 다음 해당 콜백에서 나머지 처리를 수행합니다 (위 그림 참조).

이벤트 지향 프로그래밍에 대한 자세한 내용은 this (및 해당 링크)을 읽으십시오. 또한 search 위키 —에는 많은 예제와 배경 지식이 포함되어 있습니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 위의 코드는 직렬 포트에 데이터가 없더라도 이벤트 루프에서 벗어나 이벤트를 계속 검색하지 않는 동일한 문제를 제공합니다. 직렬 포트에 데이터가없는 경우 처리 할 다른 이벤트가 있으면 어떻게합니까? 간단히 말해서 위의 코드는 모두 내 시스템을 블럭킹하고 아무 것도 할 수 없도록합니다. 내가 여기서 말하는 말을 이해할 수 있니? 그렇다면 제발 도와주세요 – user1497818

+0

아니, 무슨 뜻인지 이해가 안돼. 이벤트 루프를 사용하면 데이터에 대한 대기 중을 잊을 수 있습니다. 데이터를 사용할 수있을 때 호출 할 명령 접두어를 설정합니다. 주어진 시간에 여러 채널에 여러 개의 콜백을 설치할 수 있습니다. 그들은 각 외계인을 방해하지 않습니다. "이벤트 검색"과 같은 것은 없습니다. 기본적으로'vwait'를 호출하면 코드가 효과적으로 잠자기 상태가되어 콜백이 등록 된 이벤트가있을 때만 깨어나 콜백이 실행됩니다. – kostix