Tcl线程:如何访问线程中的全局变量 [英] Tcl Thread : How to access global variables in thread
问题描述
我有一个名为"startMyProc {num}"的程序.我希望该过程由两个不同的线程调用,并等待两个线程完成.我尝试了给出的有效解决方案.我想访问startMyProc中的全局变量并调用另一个proc"startMyAnotherProc {num}".该怎么办?
I have a proc named "startMyProc {num}". I want this proc to be called by two different threads and wait for both the threads to complete. I tried the solution given which is working. I want to access the global variables in startMyProc and call a another proc "startMyAnotherProc {num}". How can this be done?
package require Thread
global myVar
set myVar false
set id1 [thread::create -joinable {
source sample.tcl
thread::wait
}]
set id2 [thread::create -joinable {
source sample.tcl
thread::wait
}]
set num 1
thread::send -async $id1 [list startMyProc $num]
set num 2
thread::send -async $id2 [list startMyProc $num]
thread::join $id1
thread::join $id2
My sample.tcl looks like this,
proc startMyProc { num } {
global myVar
puts $myVar
puts "Opening $num"
after 2000
puts "Opening $num"
after 2000
puts "Opening $num"
after 2000
startMyAnotherProc $myVar
return
}
proc startMyAnotherProc { num } {
puts "Opening Another Proc: $num"
after 2000
puts "Opening Another Proc: $num"
after 2000
return
}
推荐答案
每个线程都有自己的完整解释器,与程序中的所有其他解释器隔离(thread
程序包的命令功能除外).在所有线程中获取该过程的最简单,最直接的方法是将其放在脚本文件中,然后source
作为线程启动脚本的一部分:
Each thread has its own complete interpreter, isolated from all the other interpreters in your program (except for the thread
package's commands' capabilities). The simplest, most direct way of getting the procedure in all the threads is to put it in a script file and then source
that as part of the startup script of the thread:
set t1 [thread::create -joinable {
source myProcedures.tcl
startMyProc $num
}]
set t2 [thread::create -joinable {
source myProcedures.tcl
startMyProc $num
}]
但是您会遇到另一个问题. 也不共享变量.这意味着您不会想过$num
.您应该真正使脚本启动,然后在最后执行thread::wait
.然后,您可以thread::send
将其工作(并在构建脚本时获得正确的替换).
You'll run into another problem though. Variables are also not shared. That means that you're not going to get $num
over. You should really make the scripts start up and then do thread::wait
at the end. You can then thread::send
them the work (and get the substitutions right when building the script).
set t1 [thread::create -joinable {
source myProcedures.tcl
thread::wait
}]
set t2 [thread::create -joinable {
source myProcedures.tcl
thread::wait
}]
thread::send -async $t1 [list startMyProc $num]
thread::send -async $t2 [list startMyProc $num]
但是,如果您真的在考虑向任务线程发送任务,则应该查看线程池(
However, if you are really thinking in terms of sending tasks to worker threads, you should look at the thread pool (tpool
) support; it's much easier to scale up.
# Make the thread pool
set pool [tpool::create -initcmd {
source myProcedures.tcl
}]
# Sent the work into the pool as distinct jobs
set job1 [tpool::post $pool [list startMyProc $num]]
set job2 [tpool::post $pool [list startMyProc $num]]
# Wait for all the jobs in the pool to finish
set waitingfor [list $job1 $job2]
while {[llength $waitingfor] > 0} {
tpool::wait $pool $waitingfor waitingfor
}
# Get results now with tpool::get
# Dispose of the pool
tpool::release $pool
这篇关于Tcl线程:如何访问线程中的全局变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!