干预后的一种方式""在tcl

时间:2014-06-20 09:06:38

标签: tcl

我写了一个tcl脚本,其间等待20秒。 有时我必须走出等待(或者更确切地说是停止)。 我用过: after 20000

有没有办法停止等待?

2 个答案:

答案 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更改其值。
  • 10秒后,如果用户未点击 Ctrl + C ,则变量status将设置为&#34;正常退出&#34; ,此时vwait命令退出
  • 如果用户在此期间点击 Ctrl + C ,则status将被更改,vwait命令将退出

更新

在减少原始脚本的同时,我取出了取消后命令的部分。现在我把它重新放入。注意after命令返回一个ID,我在abortTest中使用它来取消操作。