## programowanie zdarzeniowe, vwait
# + zał: msg to linia zakonczona \n, która jest listą,
# pierwsze słowo to typ
# + to rozwiązanie ma wady...
#
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) "set ::msg$typ {}"
vwait ::msg$typ
#unset ::msg$typ ::event($typ); return $::msg
unset -nocomplain ::msg$typ ::event($typ); return $::msg
}
array unset event
set event(A) {handlerA $msg}
set event(B) {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