Posted to tcl by karll at Wed Mar 25 21:02:59 GMT 2015view raw
- #
- # tcl thread demo
- #
- # creates a producer thread and uses the main thread as a consumer thread
- #
- # the consumer thread does a send to the producer thread to invoke blast,
- # a proc that continuously generates async events to the consumer thread
- #
- # with the eventmark set at 5000 events the program generates 5000 thread
- # sends and stops generating them and the consumer's after events fire
- # as expected but no new thread events are received
- #
- # commenting out the eventmark set then unlimited number of the events
- # are received by the consumer thread but the consumer thread's after
- # events never fire
- #
- # the second blast proc keeps the event loop alive in the producer.
- # way enabling the second blast proc with the eventmark set at 5000
- # shows the same after-5000 hanging behavior of the first blast proc
- #
- # with no eventmark set, though, the second blast proc works as expected
- #
- #
- package require Thread
- set consumerThread [thread::id]
- thread::configure $consumerThread -eventmark 5000
- set producerThread [thread::create {
- proc blast {thread} {
- while true {
- thread::send -async $thread hiya
- }
- }
- if 0 {
- proc blast {thread} {
- after idle blast $thread
- thread::send -async $thread hiya
- }
- }
- thread::wait
- }]
- proc periodic_timer {} {
- after 500 periodic_timer
- puts "boink"
- }
- proc hiya {} {
- if {[incr ::hiCount] % 1000 == 0} {
- puts $::hiCount
- }
- }
- periodic_timer
- thread::send -async $producerThread [list blast $consumerThread]
- vwait die