2010-11-29 36 views
0

Tout d'abord, ceci est une suite à une question précédente de mine.Accéder à l'étendue de la classe Itcl dans le fil Tcl

Je voudrais utiliser le threading dans Tcl mais en collaboration avec Itcl.

Voici un exemple:

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 

Cependant, lorsque l'instruction de condition tente d'exécuter et de vérifier si la variable isRunning est vrai, je reçois une telle erreur variable. Je comprends que c'est parce qu'un proc a seulement accès à la portée globale. Cependant, dans cette situation, je voudrais contenir la variable locale à la classe.

Existe-t-il un moyen d'accomplir ceci?

Répondre

1

Les variables Tcl sont par interprète et les interpréteurs sont fortement liés à des threads uniques (ce qui réduit considérablement le nombre de verrous au niveau global requis). Pour faire ce que vous voulez, vous devez utiliser une variable partagée. Heureusement, le support pour eux est inclus avec le paquet Thread (documentation here). Vous pouvez alors réécrire votre code comme ceci:

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 
+0

Notez que vous devez passer le handle d'objet '$ this' à l'autre thread pour qu'il sache ce qui se passe. Utiliser 'list' pour construire ce message est la méthode la plus simple pour bien faire les choses, même si cela ne peut que créer des commandes uniques. –

+0

Le vraiment paranoïaque utiliserait [[thread :: id], $ this' comme le handle, mais s'il n'y a qu'un seul maître qui n'est pas un gros problème. –