名称
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 ms和after 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