首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在TCL线程中访问Itcl类作用域

在TCL线程中访问Itcl类作用域
EN

Stack Overflow用户
提问于 2010-11-30 00:50:45
回答 1查看 504关注 0票数 0

首先,这是之前关于mine的一个问题的后续。

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

下面是一个示例:

代码语言:javascript
复制
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变量是否为true时,我得到一个没有这样的变量的错误。我知道这是因为proc只能访问全局作用域。但是,在这种情况下,我希望包含类的本地变量。

有没有办法做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-01 19:53:25

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4305957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档