当我尝试在tcl线程中调用一个进程时,我得到一个错误,指出无效的命令名。下面是我的tcl代码。请帮助确定为什么进程不能在线程中被识别。谢谢。
package require Thread
proc CPUload { Start Stop } {
for {set i $Start} {$i <= $Stop} {incr i} {
set j [expr {sqrt($i)*sqrt($i)}]
set k [expr {$i % 123}]
}
}
set id1 [thread::create]
catch {thread::send $id1 "CPUload 1 50000000"} ret
puts $ret
puts $errorInfo
while {[llength [thread::names]] > 1} {
after 500
}
错误信息如下
<>之前无效的命令名称"CPUload"在执行"CPUload 1 50000000"从内部调用"线程::发送$id1 "CPUload 1 50000000"与许多其他编程语言相比,Tcl线程之间的独立性要强得多。每个都有自己的解释器,一个完全不同的上下文,有自己的命令(和过程)和"全局"变量。您需要在另一个线程中创建您的过程。
然而,事实证明它非常简单。
set id1 [thread::create]
thread::send $id1 {
proc CPUload { Start Stop } {
for {set i $Start} {$i <= $Stop} {incr i} {
set j [expr {sqrt($i)*sqrt($i)}]
set k [expr {$i % 123}]
}
}
}
你可能还想使用-async
选项来重载调用,这样你就不会挂起原始线程等待事情完成。
thread::send -async $id1 "CPUload 1 50000000"
你可能想要调整你的代码,以便工作线程在处理完成后发送一个消息给原始线程。不过,如何做到这一点已经超出了你的问题范围。