【发布时间】:2014-06-21 03:40:44
【问题描述】:
我写了一个 tcl 脚本,中间有 20 秒的等待时间。
有时我必须从中间的等待(或者更确切地说是停止)中走出来。
我用过:
after 20000
有没有办法停止等待?
【问题讨论】:
标签: tcl
我写了一个 tcl 脚本,中间有 20 秒的等待时间。
有时我必须从中间的等待(或者更确切地说是停止)中走出来。
我用过:
after 20000
有没有办法停止等待?
【问题讨论】:
标签: tcl
如果你只是使用:
after 20000
那么不行,没有办法(当然,除了用 Ctrl+C 或 kill 杀死进程)。
如果您想在 Tcl 中进行可中断等待,请使用:
after 20000 set done 1
vwait done
这将继续为事件服务,因此可以被中断。保存 after 20000 set done 1 返回的令牌,您可以取消计时器(例如,如果您想重新安排它)。否则自己设置 (global done) 变量,您将更快完成等待。
【讨论】:
after 20000 实际上并没有被大多数 Tclers 经常使用,因为它不做任何事情,否则......
在我之前的一个工作项目中,我不得不处理类似的情况,我的脚本等待 N 秒,然后继续,除非用户点击 Ctrl+C,然后等待被取消。下面是我的脚本,为了展示它是如何工作的。
package require Tclx
proc abortTest {} {
after cancel $::afterId
set ::status "Ctrl+C detected"
}
#
# Main
#
puts "start"
set status "Ctrl+C not detected"
# when Ctrl+c detected, call abortTest
signal trap SIGINT abortTest
# Wait for N seconds
set WAIT_TIME 10000
set afterId [after $WAIT_TIME {set status "Exit normally"}]
puts "Wait for [expr {$WAIT_TIME / 1000}] seconds"
vwait status; # wait until status changed
puts $status
puts "end"
signal 命令说,“如果用户点击Ctrl+C,那么调用abortTest”after 命令将立即退出,但 TCL 解释器将在 10 秒后执行set status ... 命令。vwait 命令等到变量status 更改其值。status将被设置为“正常退出” em>,那个时候,vwait命令退出了
status 将被更改,vwait 命令退出在减少原脚本的同时,我取出了取消after命令的部分。现在我把它放回去了。注意after 命令返回一个ID,我在abortTest 中使用它来取消操作。
【讨论】: