0

首先,这是对我之前的问题的跟进。

我想在 Tcl 中使用线程,但与 Itcl 合作。

这是一个示例:

package require Itcl
package require Thread

::itcl::class ThreadTest {
  variable thread [thread::create {thread::wait}]
  variable isRunning 0

  method start {} {
    set isRunning 1
    thread::send $thread {
      proc loop {} {
        puts "thread running"

        if { $isRunning } {
          after 1000 loop
        }
      }
      loop
    }
  }

  method stop {} {
    set isRunning 0
  }
}

set t [ThreadTest \#auto]
$t start

vwait forever

但是,当条件语句尝试执行并检查isRunning变量是否为真时,我得到一个 no such variable 错误。我知道这是因为 proc 只能访问全局范围。但是,在这种情况下,我想包含该类的本地变量。

有没有办法做到这一点?

4

1 回答 1

1

Tcl 变量是每个解释器的,并且解释器被强绑定到单个线程(这大大减少了所需的全局级锁的数量)。为了做你想做的事,你需要使用一个共享变量。幸运的是,Thread 包中包含对它们的支持(此处的文档)。然后,您可以像这样重写您的代码:

package require Itcl
package require Thread

::itcl::class ThreadTest {
  variable thread [thread::create {thread::wait}]

  constructor {} {
    tsv::set isRunning $this 0
  }    
  method start {} {
    tsv::set isRunning $this 1
    thread::send $thread {
      proc loop {handle} {
        puts "thread running"

        if { [tsv::get isRunning $handle] } {
          after 1000 loop $handle
        }
      }
    }
    thread::send $thread [list loop $this]
  }

  method stop {} {
    tsv::set isRunning $this 0
  }
}

set t [ThreadTest \#auto]
$t start

vwait forever
于 2010-12-01T11:53:25.193 回答