发表帖子

@ 主贴

日期:2009-06-20 17:17:49 作者:风行水上 解答

vwait可以被看作是一个特殊的事件侦听器(Event Listener)。该事件侦听器阻塞当前进程,直到事件(指定的变量被修改)发生为止。

事件在程序中可以说是无处不在,尤其是需要交互的程序。很多程序都可以理解为下面的模式:

while(等待一个事件发生){
    处理这个事件;
    等待下一个事件;
}

这可以看作是采用循环查询的方式。使用 vwait 可以把它改成事件驱动的(Event Driven)。考虑这样一个例子

  • 使用循环的例子
set fp [open "| cat"]

while {[eof $fp]!=1} {
    gets $fp
    line puts "== $line"
    after 500 ; # wait 500 ms
}

puts "INFO: Exit Tcl!"
close $fp
  • 使用vwait的例子

proc test_stdin {} {
    global fp
    global state
    gets $fp line
    puts "== $line"
    if [eof $fp] {
        puts "INFO: Process Exit! set state to notify Tcl!"
        set state "exit"
    } else {
        puts "INFO: keep wait 500 ms ..."
        after 500 test_stdin
    }
}

set fp [open "| cat"]
puts "INFO: type 'Ctrl-D' to exit!"
test_stdin

vwait state

puts "INFO: Exit Tcl!"
close $fp