0

我在 cancel 之后编写了以下代码进行测试。此代码应该只打印一次“现在更新”,但它打印了 10 次,所以任何人都可以告诉我为什么取消后不起作用

proc update_now {} {
    puts "Now updating"
}
proc print_now {} {
    after cancel [update_now]
    after idle [update_now]
}
for {set count 0} {$count < 5} {incr count} {
    print_now
}
4

1 回答 1

2

你很困惑。首先,您同时使用after idle和调用after cancel结果update_now(碰巧是一个空字符串,这是一个无操作脚本),而不是在要调用 update_now的脚本上使用. Tcl 对参考与使用非常严格。相反,您想要更多类似的东西:

proc print_now {} {
    after cancel update_now
    after idle update_now
    # You could use {update_now} or [list update_now] too; no real difference here
}

其次,您应该真正专注于仅通过令牌而不是根据您的搜索来取消。为此,您实际上是这样做的:

proc print_now {} {
    global print_now_token
    after cancel $print_now_token
    set print_now_token [after idle update_now]
}
# Initialise the variable
set print_now_token {}
于 2013-09-05T09:07:38.437 回答