Вызов proc в потоке 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
}

Сообщение об ошибке выглядит следующим образом

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

person Karthik    schedule 22.08.2015    source источник
comment
Прочтите документацию по потокам... Вам нужно загрузить/инициализировать свои процессы в потоках, они не распределяются автоматически/магическим образом.   -  person schlenk    schedule 22.08.2015


Ответы (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"

Вы можете настроить свой код так, чтобы рабочий поток отправлял сообщение обратно исходному потоку после завершения обработки. Как это сделать, выходит за рамки вашего конкретного вопроса.

person Donal Fellows    schedule 22.08.2015