События#
Введение#
События позволяют запускать функции параллельно, используя объекты событий. Вместо вызова функций или потоков по очереди, события позволяют регистрировать функции, а затем запускать их все одновременно. Каждая зарегистрированная функция выполняется в собственном потоке, поэтому ваш робот может одновременно выполнять несколько действий — например, мигать сенсорными светодиодами и двигаться.
Ниже приведён список доступных методов и конструкторов:
Event– Создает новый объект события.broadcast– Запускает все зарегистрированные функции в объекте события для параллельного выполнения.broadcast_and_wait– Запускает все зарегистрированные функции в объекте события и ожидает их завершения, прежде чем продолжить.event– Регистрирует функцию в объекте события, при необходимости с аргументами.
Create an Event Object#
Событие Event создает объект события, который управляет выполнением функции в отдельных потоках.
Usage:
Event()
Параметр |
Описание |
|---|---|
Этот конструктор не имеет параметров. |
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 запускает событие, приводящее к запуску всех зарегистрированных функций в отдельных потоках. Этот метод не приостанавливает выполнение каких-либо последующих функций.
Usage:
my_event.broadcast()
Параметр |
Описание |
|---|---|
|
Имя ранее созданного объекта события. |
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 запускает событие, но ожидает завершения всех зарегистрированных функций, прежде чем продолжить выполнение последующих функций.
Usage:
my_event.broadcast_and_wait()
Параметр |
Описание |
|---|---|
|
Имя ранее созданного объекта события. |
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#
При регистрации функции для события она будет выполняться в отдельном потоке после трансляции события.
Usage:
event(callback, args)
Параметр |
Описание |
|---|---|
|
Имя ранее созданного объекта события. |
|
Заранее определенная функция, которая будет выполнена при трансляции события. |
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)