wm withdraw .; wm geom .output 379x366+231+5; wm geo .konsola 724x689+626+5; catch {source ~/tcl/111/dodatki2_kons.tcl} ## programowanie zdarzeniowe, coroutine # + zał: msg to linia zakonczona \n, która jest listą, # pierwsze słowo to typ # + to ma trochę mniej wad... # lassign [chan pipe] wy we # ^ łącze nienazwane do wysylania msg fileevent $wy readable { set msg [gets $wy]; if {[eof $wy]} {close $wy; return} set typ [lindex $msg 0] if {![info exists event($typ)]} {_puts "brak obslugi $typ"; return} eval $event($typ) # ^ to się wykonuje na poziomie globalnym } proc czekaj_na typ { set ::event($typ) [info coroutine] yield unset ::event($typ); return $::msg } array unset event set event(A) {coroutine coroA handlerA $msg} set event(B) {coroutine coroB handlerB $msg} # ^ początkowa obsluga zdarzeń proc handlerA {m} { _puts "A/111 '$m'" set m2 [czekaj_na A1] _puts "A/222 '$m2'" } proc handlerB {m} { _puts "B/111 '$m'" set m2 [czekaj_na B1] _puts "B/222 '$m2'" } # ^^^ wykonaj ^^^ .output.t delete 1.0 end array get event puts $we "A 123"; flush $we puts $we "B 321"; flush $we # ^ nie przewidziano 2 msg typu A pod rząd !!! fileevent $wy readable array get event puts $we "B1 3211"; flush $we puts $we "A1 1233"; flush $we exit