2010-11-19 16 views
1

Sürekli olarak bir iş parçacığı çalıştırmaya çalışıyorum ve tcl ana olay döngüsü tarafından engellenmemesi gerekiyor. infinite_loop proc denilen ve ana olay döngü sonsuz çalışır edilir, bu kodTcl dizgisinin ana olay döngüsü tarafından engellenmesini engelle

#!/bin/sh 
#\ 
exec tclsh "$0" "[email protected]" 

package require Thread 

set ::a_thread [thread::create {thread::wait}] 

proc start_a {} { 
    thread::send $::a_thread { 
    puts "Running a thread" 
    } 
    after 1000 a_start 
} 

proc infinite_loop {} { 
    while {1} { 
    puts "Loop" 
    after 500 
    } 
} 

start_a 
infinite_loop 

vwait forever 

: İşte yapmaya çalışıyorum şeyin basit bir örnektir. a_thread hala arka planda çalışabilirse bunu isterim. Bunu nasıl başarabilirim?

cevap

6

Ana olay döngüsü iş parçacığını engellemiyor. Bunun yerine iş parçacığı içinde yürütülecek komutları shedule için ana olay döngüsünü kullanıyorsunuz. beklendiği gibi Kod test edilmiş ve çalışır

: Bunun yerine, iplik kendisinde zamanlayıcı çalıştırmak

thread::send $::a_thread { 
    proc loop {} { 
     puts "running a thread" 
     after 1000 loop 
    } 
    loop 
} 

while 1 { 
    puts "loop" 
    after 500 
} 
+0

Teşekkürler, Tcl wiki örnekleri bu tür bir durumu gözden kaçırmış gibi görünüyordu. – elmt

5
tabii

cevaptır, slebetman tarafından verilen bir. Ancak, bu tür bir şeyde (özellikle daha karmaşık durumlarda) hata ayıklamanın bir yolu, her bir iş parçacığı tarafından yazdırılan iletileri thread::id ve ile her seferinde başlangıcında başlangıcında bir ileti yazdığınızdan emin olmaktır Döngü yuvarlak. Örneğin:

package require Thread 

set ::a_thread [thread::create {thread::wait}] 

proc start_a {} { 
    puts "[thread::id]: Dispatch to $::a_thread" 
    thread::send $::a_thread { 
    puts "[thread::id]: Running a thread" 
    } 
    after 1000 a_start 
} 

proc infinite_loop {} { 
    while {1} { 
    puts "[thread::id]: Loop" 
    after 500 
    } 
} 

start_a 
infinite_loop 
puts "[thread::id]: Start main event loop" 
vwait forever 

sevk diğer dizisindeki koşu (varsayılan olarak yürütülürken tamamlamak için komut dosyası thread::send bekler) eşzamanlı oluyor ki, bir zamanlar oluyor ve anlattık olurdu Bu sonsuz döngü olduğunu ana olay döngüsünün başlatılmasını engeller (ve dolayısıyla gönderimin yeniden zamanlanması). Kimin ne yaptığını bilmediğinizden, tabii ki karışıklık oldu!

+0

Çok kullanışlı ipucu. Bu benim ilk adımı tcl treading, bu yüzden gelecekteki girişimlerimde yardımcı olacaktır. – elmt

İlgili konular