【问题标题】:A way to intervene "after" in tcl一种在 tcl 中干预“之后”的方法
【发布时间】:2014-06-21 03:40:44
【问题描述】:

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

有没有办法停止等待?

【问题讨论】:

    标签: tcl


    【解决方案1】:

    如果你只是使用:

    after 20000
    

    那么不行,没有办法(当然,除了用 Ctrl+Ckill 杀死进程)。

    如果您想在 Tcl 中进行可中断等待,请使用:

    after 20000 set done 1
    vwait done
    

    这将继续为事件服务,因此可以被中断。保存 after 20000 set done 1 返回的令牌,您可以取消计时器(例如,如果您想重新安排它)。否则自己设置 (global done) 变量,您将更快完成等待。

    【讨论】:

    • Straight after 20000 实际上并没有被大多数 Tclers 经常使用,因为它不做任何事情,否则......
    【解决方案2】:

    在我之前的一个工作项目中,我不得不处理类似的情况,我的脚本等待 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 更改其值。
    • 10秒后,如果用户没有按下Ctrl+C,那么变量status将被设置为“正常退出” em>,那个时候,vwait命令退出了
    • 如果用户在此期间按下 Ctrl+C,则 status 将被更改,vwait 命令退出

    更新

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多