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変数が true かどうかを確認しようとすると、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 に答える