我写了一个tcl脚本,其中有20秒的等待时间。有时候我需要在等待过程中退出(或者说停止)等待。我使用了:after 20000
有办法停止等待吗?
我写了一个tcl脚本,其中有20秒的等待时间。有时候我需要在等待过程中退出(或者说停止)等待。我使用了:after 20000
有办法停止等待吗?
after 20000
如果不想使用Ctrl+C或kill
来结束进程,那么没有其他方法。
如果您想在Tcl中进行可中断的等待,请使用以下代码:
after 20000 set done 1
vwait done
这将继续服务事件,因此可以被中断。保存由after 20000 set done 1
返回的令牌,您可以取消计时器(例如,如果您想重新安排它)。否则,自己设置(全局done
)变量,您将更快完成等待。
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
将被设置为"正常退出",此时vwait
命令将退出。status
将被更改,vwait
命令将退出。在缩小原始脚本的同时,我删除了取消after
命令的部分。现在我正在将其放回。需要注意的是,after
命令返回一个ID,我在abortTest
中使用它来取消操作。