Tcl线程:如何访问线程中的全局变量 [英] Tcl Thread : How to access global variables in thread

查看:195
本文介绍了Tcl线程:如何访问线程中的全局变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个名为"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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆