52 lines
1.4 KiB
Tcl
52 lines
1.4 KiB
Tcl
|
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...
|
||
|
}
|