source symul_lib.tcl; # ladowanie symulatora # tworzymy graf komunikacyjny (w tym wypadku cykl) set liczbaWierz 5 set sasiedzi(0) {4 1} set sasiedzi(1) {0 2} set sasiedzi(2) {1 3} set sasiedzi(3) {2 4} set sasiedzi(4) {3 0} # główny program na każdym wierzchołku/fiberze... fiber create $liczbaWierz { if {$id==0} {wyslij 1 0} fiber yield; # oznacza koniec rundy while {$run} { # zmienna run pozwala zakonczyć działanie symulacji if {$kom(0)!=""} { set x $kom(0) incr x wyslij 1 $x } fiber yield; # oznacza koniec rundy } } Inicjalizacja; # koniecznie trzeba to wywołać !!! proc wizualizacja {} { fiber_iterate {_puts "$id: $kom0, $kom1"} # petla fiber_iterate iteruje po wszystkich fiberach # proc wizualizacja wywolujemy z konsoli po kazdej rundzie } # !!! do tego miejsca wszystko wykonać !!!!!!!!!!!!!!!!!!!!! fiber yield; runda; wizualizacja # wykonuje kolejna runde... # procedura runda dostarcza wysłane komunikaty if 0 { # to się czasem przydaje: set_run 0; fiber yield; runda; set_run 1; fiber delete # usuwanie fiberów set_run 0; fiber yield; runda; set_run 1; fiber restart # restart kodu fiberów fiber error # wyświetla stan fiberów ({}, ended, error) fiber_eval 0 {set id} # wykonanie kodu w fiberze 0 # UWAGA: fiber_eval wykonuje kod na poziomie globalnym # "fiber0 eval {set id}" wykonuje kod tam gdzie fiber zostal zamrozony... }