ZetCode

Tcl after 命令

最后修改于 2025 年 4 月 3 日

Tcl 的 after 命令用于在延迟后调度脚本执行。它对于在 Tcl 中创建计时器和延迟操作至关重要。该命令同时支持毫秒和脚本回调。

基本定义

after 命令会延迟脚本执行或返回计时器 ID。它可以调度一次性事件或重复事件。该命令与 Tcl 的事件循环集成。

语法:after ms ?script?。只有一个参数时,它会暂停执行。有两个参数时,它会在 ms 毫秒后调度脚本执行。

简单延迟

本示例展示了 after 命令的基本延迟功能。

basic_delay.tcl
puts "Start"
after 2000
puts "End"

此脚本打印“Start”,等待 2000 毫秒(2 秒),然后打印“End”。带有一个参数的 after 命令会暂停执行。

调度脚本执行

本示例演示了在主脚本继续执行的同时,调度一个脚本在延迟后运行。

scheduled_script.tcl
puts "Main script starts"
after 1000 {puts "Delayed message"}
puts "Main script continues"
vwait forever

主脚本开始,调度一条消息在 1 秒后出现,然后继续执行。vwait 保持事件循环运行以处理延迟的脚本。

取消已调度的事件

after cancel 命令使用计时器 ID 取消先前已调度的事件。

cancel_event.tcl
set id [after 3000 {puts "This won't appear"}]
after 1000 {after cancel $id; puts "Event canceled"}
vwait forever

此脚本安排在 3 秒后显示一条消息,但在 1 秒后将其取消。after cancel 命令使用第一个 after 返回的 ID。

重复计时器

此示例通过让回调函数重新调度自身来创建重复计时器。

repeating_timer.tcl
proc repeat {} {
    puts "Tick [clock format [clock seconds] -format %T]"
    after 1000 repeat
}
repeat
vwait forever

repeat 过程每秒打印一次当前时间。每次调用都会安排自身在 1000 毫秒后再次运行。

多个计时器

本示例展示了如何使用不同的间隔管理多个独立的计时器。

multiple_timers.tcl
proc timer1 {} {
    puts "Timer1: [clock seconds]"
    after 1500 timer1
}

proc timer2 {} {
    puts "Timer2: [clock seconds]"
    after 2500 timer2
}

timer1
timer2
vwait forever

两个独立的计时器以不同的间隔(1.5 秒和 2.5 秒)运行。每个计时器通过在其回调中调用 after 来维护自己的调度。

带参数的 after

本示例演示了如何使用 after 将参数传递给回调过程。

after_with_args.tcl
proc callback {msg count} {
    puts "$msg $count"
    incr count
    after 1000 [list callback $msg $count]
}

callback "Count:" 1
vwait forever

callback 过程接收并递增一个计数器。list 命令确保在调度下一次执行时正确传递参数。

最佳实践

本教程介绍了 Tcl 的 after 命令,并提供了实用示例,展示了计时器的创建、延迟执行和事件调度。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 Tcl 教程