Wydarzenia#
Wstęp#
Zdarzenia umożliwiają równoległe uruchamianie funkcji za pomocą obiektów zdarzeń. Zamiast wywoływać funkcje lub wątki jedno po drugim, zdarzenia pozwalają zarejestrować funkcje, a następnie uruchomić je wszystkie jednocześnie. Każda zarejestrowana funkcja działa we własnym wątku, dzięki czemu robot może wykonywać wiele czynności – takich jak miganie diodami TouchLED i sterowanie – jednocześnie.
Poniżej znajduje się lista dostępnych metod i konstruktorów:
Event– Tworzy nowy obiekt zdarzenia.broadcast– Uruchamia wszystkie zarejestrowane funkcje w obiekcie zdarzenia, aby działały równolegle.broadcast_and_wait– Uruchamia wszystkie zarejestrowane funkcje w obiekcie zdarzenia i czeka na ich zakończenie przed kontynuowaniem.event– Rejestruje funkcję w obiekcie zdarzenia, opcjonalnie z argumentami.
Create an Event Object#
Event tworzy obiekt zdarzenia, który zarządza wykonywaniem funkcji w oddzielnych wątkach.
Usage:
Event()
Parametr |
Opis |
|---|---|
Ten konstruktor nie ma żadnych parametrów. |
def dash_lines():
# Move the pen up and down
while True:
pen.move(DOWN)
wait(0.5, SECONDS)
pen.move(UP)
wait(0.5, SECONDS)
def main():
# Set the event
move_event = Event()
move_event(dash_lines)
# Draw the dash line while driving forward
move_event.broadcast()
drivetrain.drive_for(FORWARD, 1000, MM)
# VR threads — Do not delete
vr_thread(main)
Broadcast#
broadcast wyzwala zdarzenie, uruchamiając wszystkie zarejestrowane funkcje w oddzielnych wątkach. Ta metoda nie wstrzymuje wykonywania żadnych kolejnych funkcji.
Usage:
my_event.broadcast()
Parametr |
Opis |
|---|---|
|
Nazwa wcześniej utworzonego obiektu zdarzenia. |
def dash_lines():
# Move the pen up and down
while True:
pen.move(DOWN)
wait(0.5, SECONDS)
pen.move(UP)
wait(0.5, SECONDS)
def main():
# Set the event
move_event = Event()
move_event(dash_lines)
# Draw the dash line while driving forward
move_event.broadcast()
drivetrain.drive_for(FORWARD, 1000, MM)
# VR threads — Do not delete
vr_thread(main)
Broadcast and wait#
broadcast_and_wait rozpoczyna zdarzenie, ale czeka na zakończenie wszystkich zarejestrowanych funkcji, zanim przejdzie do wykonywania kolejnych funkcji.
Usage:
my_event.broadcast_and_wait()
Parametr |
Opis |
|---|---|
|
Nazwa wcześniej utworzonego obiektu zdarzenia. |
def move_and_turn():
# Drive forward and turn
drivetrain.drive_for(FORWARD, 150, MM)
drivetrain.turn_for(RIGHT, 90, DEGREES)
def main():
# Wait for the event to finish after 3 seconds
move_event = Event()
move_event(move_and_turn)
while True:
if brain.timer_time(SECONDS) > 3:
move_event.broadcast_and_wait()
break
wait(5, MSEC)
brain.print("Movement done.")
# VR threads — Do not delete
vr_thread(main)
Register Functions to an Event#
Gdy zarejestrujesz funkcję dla zdarzenia, zostanie ona wykonana w osobnym wątku, gdy zdarzenie zostanie rozgłoszone.
Usage:
event(callback, args)
Parametr |
Opis |
|---|---|
|
Nazwa wcześniej utworzonego obiektu zdarzenia. |
|
Wcześniej zdefiniowana funkcja, która ma zostać wykonana po rozesłaniu zdarzenia. |
def dash_lines():
# Move the pen up and down
while True:
pen.move(DOWN)
wait(0.5, SECONDS)
pen.move(UP)
wait(0.5, SECONDS)
def main():
# Set and call the event and start driving
move_event = Event()
move_event(dash_lines)
move_event.broadcast()
drivetrain.drive(FORWARD)
# VR threads — Do not delete
vr_thread(main)