我在我工作场所的TCL自动化环境中工作。 我正在尝试使用“after”在我的脚本中运行延迟命令。 我遇到的问题是,当我尝试在“后”下的代码块内部使用变量指定命令时,无法识别变量并且我收到错误消息。 我将引用代码的相关部分。
proc test_script1 {{bh0 0} ...more vars....} {
.
.
.
after [expr 20000] {
set some_value[ ns1::probe_TCP_connections $bh0 $main_duration 1 15] }
puts "the value i got is $some_value"
}
我似乎得到一个错误: 无法读取“some_value”:没有这样的变量
任何人都可以提出问题是什么,以及如何过度使用它? THX
答案 0 :(得分:3)
您可以在apply
的帮助下捕获局部变量的值(建议使用list
构建回调,当它们甚至有点不平凡时)。由于apply
的主体是一个具有自己范围的lambda表达式 - 一个无名的过程 - 你必须在其中使用global
来访问将持久存在的状态,并且无论如何{{1}总是从全局命名空间调用回调函数(因为该机制不知道如何在异步操作期间保持任意堆栈帧。)
after
有可能变得更复杂,特别是在Tcl 8.6中,它有一个可以用来隐藏使用连续传递样式编程的复杂性的协程系统。
答案 1 :(得分:1)
这是proc
,它会做与您尝试做的事情类似的事情:
proc foo {} {
# Make 'a' available to both the global scope and local scope
global a
# This is to check the current level
puts "Current level: [info level]"
# The command to be run in 500 ms, and I have added another check for the level
after 500 {puts "Current level: [info level]"; set a 100}
# Wait for further execution until the global variable 'a' changes
vwait a
# Prints a
puts "Value of \$a: $a"
}
以上的输出将是:
Current level: 1
# After 500 ms, the below will print
Current level: 0
Value of $a: 100
当您使用after
时,变量a
将在全局范围内创建,除非明确授予访问权限,否则proc无法访问该变量。最简单的方法之一是首先确保proc中的a
可以全局和本地访问,global
(级别0)。