2015-08-22 90 views
0

當我嘗試調用tcl線程中的proc時,出現一個錯誤,指出無效的命令名。以下是我的tcl代碼。請幫助確定proc在線程中無法識別的原因。謝謝。在tcl線程中調用proc

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 
} 

錯誤味精是如下

 
invalid command name "CPUload" 
    while executing 
"CPUload 1 50000000" 
    invoked from within 
"thread::send $id1 "CPUload 1 50000000"" 
+0

閱讀線程文檔...您需要在線程中加載/初始化您的特效,它們不會自動/神奇地共享。 – schlenk

回答

1

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" 

您可能需要調整您的代碼,以便工作線程在處理完成後將消息發送回原始線程。如何做到這一點超出了你的特定問題的範圍。