Доступ к области действия класса Itcl в потоке Tcl - PullRequest
0 голосов
/ 29 ноября 2010

Прежде всего, это продолжение предыдущего вопроса mine .

Я хотел бы использовать многопоточность в 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 истинной, я не получаю такую ​​ошибку переменной.Я понимаю, что это потому, что процесс имеет доступ только к глобальной области видимости.Однако в этой ситуации я хотел бы содержать переменную, локальную для класса.

Есть ли способ сделать это?

1 Ответ

1 голос
/ 01 декабря 2010

Переменные 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
...