我已经编写了以下代码来取消后进行测试。这段代码应该只打印一次“现在更新”,但它打印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
}
答案 0 :(得分: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 {}