portal Michała Hanćkowiaka
Begin main content
wm withdraw .; wm geom .output 379x366+231+5; wm geo .konsola 724x689+626+5; catch {source ~/tcl/111/dodatki2_kons.tcl}

## 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

uwaga: portal używa ciasteczek tylko do obsługi tzw. sesji...