在tcl线程中调用进程



当我尝试在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"

你可能想要调整你的代码,以便工作线程在处理完成后发送一个消息给原始线程。不过,如何做到这一点已经超出了你的问题范围。

最新更新