Posted to tcl by aspect at Wed May 14 11:20:23 GMT 2014view raw
- package provide worker_thread 0.1
- package require Thread
- proc t {args} { puts [clock microseconds]:\ [string range [info level -1]:\ [uplevel 1 [list subst $args]] 0 100]}
- proc t args {}
- ::oo::class create WorkerThread {
- variable result
- variable cmdprefix
- variable worker
- constructor {args} {
- set result {}
- set cmdprefix $args
- set worker [thread::create {
- proc t {args} { puts [clock microseconds]:\ [string range [info level -1]:\ [uplevel 1 [list subst $args]] 0 100]}
- proc t args {}
- package require Thread
- proc poll {} {
- if {[info commands coro] ne {}} {
- return [coro]
- } else {
- return {}
- }
- }
- proc task {args} {
- if {[info commands coro] ne {}} {
- rename coro {}
- }
- coroutine coro {*}$args
- }
- thread::wait
- }]
- # if {$args ne {}} {
- # thread::send $worker [concat $args]
- # }
- trace add variable [namespace current]::result write [list [self] callback]
- }
- method eval {args} {
- thread::send -async $worker [concat {*}$args]
- }
- method send {args} {
- thread::send -async $worker [concat task $args] [namespace current]::result
- }
- method callback {args} {
- if {$result eq {}} {
- #after 500 [list thread::send -async $worker poll [namespace current]::result]
- } else {
- uplevel #0 $cmdprefix $result
- after 0 [list thread::send -async $worker poll [namespace current]::result]
- }
- }
- }