我写了一个tcl脚本,其间等待20秒。
有时我必须走出等待(或者更确切地说是停止)。
我用过:
after 20000
有没有办法停止等待?
答案 0 :(得分:3)
如果您只是使用:
after 20000
然后不,没有办法(除了用 Ctrl + C 或kill
杀死进程当然)。
如果您想在Tcl中进行可中断的等待,请使用:
after 20000 set done 1
vwait done
这将继续服务事件,因此可以中断。保存after 20000 set done 1
返回的令牌,您可以取消计时器(例如,如果您想重新安排它)。否则自己设置(全局done
)变量,你就会很快完成等待。
答案 1 :(得分:2)
在我之前的一个工作项目中,我不得不处理类似的情况,即我的脚本等待N秒,然后继续,除非用户点击 Ctrl + C < / kbd>,然后等待被取消。下面是我的脚本,简化为显示它是如何工作的必要条件。
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
命令说,&#34;如果用户点击 Ctrl + C ,则拨打abortTest
&#34; < / LI>
after
命令将立即退出,但TCL解释器将在10秒后执行set status ...
命令。vwait
命令等待变量status
更改其值。status
将设置为&#34;正常退出&#34; ,此时vwait
命令退出status
将被更改,vwait
命令将退出在减少原始脚本的同时,我取出了取消后命令的部分。现在我把它重新放入。注意after
命令返回一个ID,我在abortTest
中使用它来取消操作。