Wydarzenia#
Wstęp#
Zdarzenia umożliwiają równoległe uruchamianie funkcji. Zamiast wywoływać funkcje sekwencyjnie, można zarejestrować wiele funkcji w zdarzeniu i uruchomić je wszystkie jednocześnie. Każda zarejestrowana funkcja działa we własnym wątku, umożliwiając robotowi jednoczesne wykonywanie wielu zadań – na przykład wyświetlanie wartości na ekranie podczas jazdy.
Aby utworzyć i następnie użyć zdarzenia, wykonaj kolejno poniższe kroki:
Utwórz zdarzenie za pomocą
Event.Zarejestruj funkcję, która zostanie wyzwolona, gdy zostanie nadane zdarzenie
Event, wywołując obiekteventz funkcją jako argumentem.Broadcast an
Event:broadcast— Wyzwala wszystkie zarejestrowane funkcje w obiekcie zdarzenia, aby działały jednocześnie.broadcast_and_wait— Uruchamia wszystkie zarejestrowane funkcje w obiekcie zdarzenia i czeka na ich zakończenie przed kontynuowaniem.
Utwórz wydarzenie#
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. |
# Blink the screen while moving forward
# Create move_event as an Event object
move_event = Event()
def blink_screen():
while True:
brain.screen.clear_screen(Color.RED)
wait(0.5, SECONDS)
brain.screen.clear_screen()
wait(0.5, SECONDS)
move_event(blink_screen)
move_event.broadcast()
drivetrain.drive(FORWARD)
Rejestrowanie funkcji dla zdarzenia#
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. |
|
Optional. A tuple of arguments to pass to the callback function. |
# Blink the screen while turning
move_event = Event()
def blink_screen():
while True:
brain.screen.clear_screen(Color.RED)
wait(0.5, SECONDS)
brain.screen.clear_screen()
wait(0.5, SECONDS)
def turning():
drivetrain.turn(RIGHT)
# Register multiple functions to the Event object
move_event(blink_screen)
move_event(turning)
move_event.broadcast()
# Move in a specified direction
move_event = Event()
def move_distance(movement_angle):
drivetrain.turn_for(RIGHT, movement_angle, DEGREES)
drivetrain.drive_for(FORWARD, 100, MM)
# Change the parameter to modify how the robot moves
move_event(move_distance, (180,))
move_event.broadcast()
Transmisja wydarzenia#
broadcast#
broadcast wyzwala zdarzenie, uruchamiając wszystkie zarejestrowane funkcje w oddzielnych wątkach. Ta metoda nie wstrzymuje wykonywania żadnych kolejnych funkcji.
Usage:
event.broadcast()
Parametr |
Opis |
|---|---|
|
Nazwa wcześniej utworzonego obiektu zdarzenia. |
# Blink the screen while moving forward
# Create move_event as an Event object
move_event = Event()
def blink_screen():
while True:
brain.screen.clear_screen(Color.RED)
wait(0.5, SECONDS)
brain.screen.clear_screen()
wait(0.5, SECONDS)
move_event(blink_screen)
move_event.broadcast()
drivetrain.drive(FORWARD)
broadcast_and_wait#
broadcast_and_wait rozpoczyna zdarzenie, ale czeka na zakończenie wszystkich zarejestrowanych funkcji, zanim przejdzie do wykonywania kolejnych funkcji.
Usage:
event.broadcast_and_wait()
Parametr |
Opis |
|---|---|
|
Nazwa wcześniej utworzonego obiektu zdarzenia. |
# Move after the screen is pressed
move_event = Event()
def move_and_turn():
drivetrain.drive_for(FORWARD, 150, MM)
drivetrain.turn_for(RIGHT, 90)
move_event(move_and_turn)
while True:
if brain.buttonCheck.pressing():
move_event.broadcast_and_wait()
break
brain.screen.print("Movement done.")