Posted to tcl by mjanssen at Wed Nov 21 10:24:04 GMT 2007view pretty
# A package require comm # it behaves almost like a normal interactive session :P # invoke 'eventloop' to enter the event loop proc stdin {} { global stdin if {[info complete [append stdin [gets stdin]]]} { if {$stdin=="exit"} { unset ::eventloop; unset stdin } { catch {uplevel #0 $stdin} stdin puts -nonewline "$stdin\n% " flush stdout set stdin "" } } { append stdin "\n" } } proc eventloop {} { if {[info exists eventloop]} { puts -nonewline "You're already in the event loop :)\n%" flush stdout } { fileevent stdin readable stdin set ::eventloop 1 puts -nonewline "Entering the event loop...\n% " flush stdout vwait eventloop puts "Exiting the event loop..." fileevent stdin readable {} } } proc done {id results} { puts "$id is done -> $results" } proc do {id cmd} { comm::comm send -async $id [list do [comm::comm self] $cmd] return {} } eventloop # B package require comm puts "I am [comm::comm id]" proc do {from cmd} { puts "executing \"$cmd\" from $from" catch {uplevel #0 $cmd} result comm::comm send -async $from [list done [comm::comm self] $result] } vwait forever # Output A Entering the event loop... % do 2109 {expr {4+5}} % 2109 is done -> 9 # wait some time in B % do 2109 {puts "calculating" ; after 5000 ; puts "calculation done" ; expr {4+5}} % 2109 is done -> 9 # Output B I am 2109 executing "expr {4+5}" from 2108 executing "puts "calculating" ; after 5000 ; puts "calculation done" ; expr {4+5}" from 2108 calculating calculation done