Funkcje obsługi zdarzeń i sygnałów
to onzdarzenie :arg1 :arg2 ...
instrukcje
end
to onsignalnazwa :turtle :data
instrukcje
end
to onsignal :name :turtle :data
instrukcje
end
Zdarzenia w są przypisane sytuacjom, których kolejność wystąpienia jest trudna do przewidzenia podczas
pisania programu. Są to np. czynności wykonane przez elementy interfejsu użytkownika (poruszenie myszą, wciśnięcie
przycisku) oraz czynności żółwi (zderzenie żółwi, przekroczenie granicy okna graficznego). Zdarzenia można powiązać
z funkcjami obsługi, które są wyzwalane przez dane zdarzenie.
Sygnały są specjalnym przypadkiem zdarzeń. Są generowane programowo przez żółwie i stopery. Sygnały pozwalają
na synchronizację równoległego działania wielu żółwi.
Aby zdefiniować funkcję obsługi zdarzenia wystarczy nadać jej odpowiednią nazwę i użyć zestawu argumentów używanego
w danym zdarzeniu. Nazwa funkcji powinna być nazwą zdarzenia z przedrostkiem "on".
Funkcja obsługi sygnału powinna nosić nazwę danego sygnału z przedrostkiem "onsignal"; w tym przypadku dostępne argumenty
to :turtle
(żółw, który wysłał sygnał) i :data
(zmienna zawierająca
informacje dodane podczas zgłaszania sygnału). Funkcja o nazwie "onsignal" obsługuje wszystkie sygnały, które nie zostały
wcześniej obsłużone przez dedykowane funkcje "onsignalnazwa"; w tym przypadku dostępny jest argument
:name
zawierający nazwę sygnału.
Funkcja obsługi jest wykonywana jako osobne zadanie żółwia. Zadania te są wstawiane do kolejki zadań w kolejności,
w jakiej nadeszły zdarzenia.
Uwaga 1: Definicja funkcji obsługi nie musi wykorzystywać wszystkich argumentów zdarzenia, jednak te, które są użyte,
muszą zachować kolejność podaną w opisie zdarzenia.
Uwaga 2: Funkcja obsługi zdarzenia (synału) jest aktywna dla żółwia, który zdefiniował funkcję. Funkcja obsługi jest
widoczna ale nieaktywna dla żółwi utworzonych przez żółwia definiującego funkcję. Instrukcje
eventenable
, eventdisable
umożliwiają włączanie i wyłączanie obsługi zdarzenia po zdefiniowaniu funkcji obsługi.
Przykład 1:
to onmouseclick :mousepos
print :mousepos
end
Rezultat wykonania:
Pozycja kliknięcia myszą wypisana po każdym kliknięciu.
{-295 130}
{119 18}
{-14 -100}
{87 145}
Przykład 2:
to onsignalcyk :turtle :data
(print :turtle :data)
end
"t := (timer "cyk 300 50 4)
Rezultat wykonania:
first {1 50.0078125 50.0078125}
first {2 301.0234375 351.03125}
first {3 302.015625 653.046875}
first {4 302.015625 955.0625}
Przykład 3:
to onsignal :name :turtle
(print "sygnał :name "od :turtle)
end
to onsignaldwa
print "dedykowana_obsługa_dwa
end
signal "raz
signal "dwa
signal "trzy
Rezultat wykonania:
sygnał raz od first
dedykowana_obsługa_dwa
sygnał trzy od first
Zobacz także:
Lista zdarzeń
Definicja i wywołanie funkcji
Spis treści