tcl/tk参考——控制结构after

名称

after - 等待一段时间后再执行命令

语法

after ms
after ms ?script script script ...?
after cancel id
after cancel script script script ...
after idle ?script script script ...?
after info ?id?

描述

这个命令用来延迟程序执行或者在后台执行命令,它有几种形式,取决于这个命令的第一个参数:

after ms
Ms必须是个整型数据,以毫秒为单位。这个命令是休眠ms毫秒后返回。当这个命令在休眠的时候应用程序不想赢任何事件。
after ms ?script script script ...?
这种形式的命令直接返回数值,但是会在ms毫秒后把一个Tcl命令作为事件处理来运行。这个命令在给出的时候就会被立刻执行.延迟命令就像 concat命令格式的风格被连接起来,这个命令将在全局运行(脱离所有Tcl进程的上下文)。当运行延迟命令时产生错误就使用 interp bgerror机制来报告错误。 after命令返回一个可以使用 after cancel来取消延迟命令的ID。
after cancel id
取消运行之前已经确定要运行的延迟命令。id指出了哪个延迟命令会被取消,之前必须有一个 after命令返回的id。如果给出 id的命令已经运行那么 after cancel就没有作用。
after cancel script script ...
这个命令也可以取消一个延迟命令的执行,这个script参数被使用空格分隔连接在一起(就像 concat命令的风格),如果有一个没有执行的命令和要取消的命令相同,这个命令就被取消运行,如果没有和要取消命令相同的命令那么 after cancel就没有作用.
after idle script ?script script ...?
script参数使用空格分隔连接在一起(就像 concat命令的风格),并且当空闲回调后安排最终的脚本稍后会被执行。这个脚本会立刻运行,接着会进入事件循环而且进程中没有事件。这个命令返回一个可以使用 after cancel取消的延迟命令ID。当运行延迟命令时产生错误就使用 interp bgerror机制来报告错误。
after info ?id?
这个命令返回当前存在的事件句柄。如果没有id参数没有提供,这个命令返回所有被 after命令创建的事件句柄。如果提供了 id,指定一个存在的句柄,这个句柄必须是之前使用 after命令返回的参数而且必须不能已经触发或者取消。这个命令返回一个包含两个元素的列表,第一个元素是命令相关的id,第二个元素指示事件句柄类型是 idle还是 timer

after msafter idle形式的命令假定应用程序是事件驱动的,直到应用程序进入了事件循环,延迟命令才会被执行.在不是一般事件驱动的应用程序当中,比如tclsh,可以使用vwait或者update命令进入事件循环.

示例

这个例子定义了一个命令使tcl空闲N秒:

proc sleep {N} {
   after [expr {int($N * 1000)}]
}

下面的脚本使wake_up在8个小时后运行(在这个时间事件循环被激活):

after [expr {1000 * 60 * 60 * 8}] wake_up

下面的命令可以被用于一步一步地方式做长时间运行的计算(就像这里描述的::my_calc::one_step,假设返回一个布尔数值来标志其它的步骤是否在执行).既然计算本身需要被排序所以可以逐步工作.这个技巧在使用的时候需要十分小心,需要避免事件循环杯进程管理给饿死(当下一个步骤去做一个已经触发的时间事件时正好事件队列被耗尽),在你做一个很慢的任务时,想确认一个TK GUI是否还有响应的时候非常有用.

proc doOneStep {} {
   if {[::my_calc::one_step]} {
      after idle [list after 0 doOneStep]
   }
}
doOneStep

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值