我需要能够设置变量以从线程内部结束vwait。这是因为我有一个循环,通常会锁定interperator,因此它会运行任何GUI,直到它完成。
我希望它像这样的睡眠命令一样运行:
global EndSleep
after ${SleepTime_ms} set EndSleep 1
vwait EndSleep
只有在查询设备的while循环退出时才需要设置vwait变量。
这是我目前的代码:
proc ::VISA::Wait {VisaAlias} {
# Link global variable
global EndWait
# Execute commands in a thread so the GUI is not locked while executing
set Thread [thread::create]
thread::send ${Thread} [list set VisaAlias ${VisaAlias}]
thread::send ${Thread} {
source MolexVisa.tcl
# Temporarily make new connection with device
VISA::Connect ${VisaAlias}
# Query operation complete bit
VISA::Query ${VisaAlias} "*OPC?"
# Continue to attempt to read OPC bit until any response is given; typically 1
while {[string equal [VISA::Read ${VisaAlias}] ""]} {}
# Destroy temporary connection
VISA::Disconnect ${VisaAlias}
# Set vwait variable
set EndWait 1
}
# Wait for thread to end
vwait EndWait
# Mark thread for termination
thread::release ${Thread}
}
目前线程仍在冻结GUI。另外,由于线程中的变量和我期望的变量不一样,显然它只是永远等待。
感谢任何建议或帮助。我相信我已经用尽所有其他更实际的方法来完成任务,但欢迎更多的见解。
答案 0 :(得分:2)
使用-async
的{{1}}标记。默认情况下,thread::send
会一直阻塞,直到脚本执行完为止(这大部分时间都会使用线程失败)。
如果您使用::thread::send
标志,您还可以使用-async
和thread::send
的可选变量参数,例如。
vwait
这可以防止GUI冻结。 请注意,斐波那契的这种实现并不是最好的,并且是“一些昂贵的计算”的占位符。