События#

Введение#

События позволяют выполнять функции параллельно. Вместо последовательного вызова функций можно зарегистрировать несколько функций в одном событии и запустить их все одновременно. Каждая зарегистрированная функция выполняется в собственном потоке, что позволяет роботу выполнять несколько задач одновременно — например, отображать значения на экране во время движения.

Для создания и последующего использования события выполните следующие действия в указанном порядке:

  1. Создайте событие с Event.

  2. Зарегистрируйте функцию, которая будет запускаться при трансляции события Event путем вызова объекта event object с функцией в качестве аргумента.

  3. Broadcast an Event:

    • broadcast – Запускает все зарегистрированные функции в объекте события для одновременного выполнения.

    • broadcast_and_wait – Запускает все зарегистрированные функции в объекте события и ожидает их завершения, прежде чем продолжить.

Создать событие#

Событие Event создает объект события, который управляет выполнением функции в отдельных потоках.

Usage:
Event()

Параметр

Описание

Этот конструктор не имеет параметров.

# Blink LEDs while moving forward
# Create move_event as an Event object
move_event = Event()

def blink_leds():
    while True:
        robot.led.on(ALL_LEDS, RED)
        wait(0.5, SECONDS)
        robot.led.on(ALL_LEDS, BLACK)
        wait(0.5, SECONDS)

move_event(blink_leds)
move_event.broadcast()
robot.move_at(0)

Регистрация функций для мероприятия#

При регистрации функции для события она будет выполняться в отдельном потоке после трансляции события.

Usage:
event(callback, args)

Параметр

Описание

event

Имя ранее созданного объекта события.

callback

Заранее определенная функция, которая будет выполнена при трансляции события.

args

Optional. A tuple of arguments to pass to the callback function.

# Blink LEDs while moving forward and turning
move_event = Event()

def blink_leds():
    while True:
        robot.led.on(ALL_LEDS, RED)
        wait(0.5, SECONDS)
        robot.led.on(ALL_LEDS, BLACK)
        wait(0.5, SECONDS)

def turning():
    robot.turn(RIGHT)

# Register multiple functions to the Event object
move_event(blink_leds)
move_event(turning)

move_event.broadcast()

# Move in a specified direction
move_event = Event()

def move_distance(movement_angle):
    robot.move_for(50, movement_angle)

# Change the parameter to modify how the robot moves
move_event(move_distance, (180,))
move_event.broadcast()

Трансляция мероприятия#

broadcast#

broadcast запускает событие, приводящее к запуску всех зарегистрированных функций в отдельных потоках. Этот метод не приостанавливает выполнение каких-либо последующих функций.

Usage:
event.broadcast()

Параметр

Описание

event

Имя ранее созданного объекта события.

# Blink LEDs while moving forward and turning
move_event = Event()

def blink_leds():
    while True:
        robot.led.on(ALL_LEDS, RED)
        wait(0.5, SECONDS)
        robot.led.on(ALL_LEDS, BLACK)
        wait(0.5, SECONDS)


move_event(blink_leds)

# Trigger the move_event Event
move_event.broadcast()
robot.move_at(0)

broadcast_and_wait#

broadcast_and_wait запускает событие, но ожидает завершения всех зарегистрированных функций, прежде чем продолжить выполнение последующих функций.

Usage:
event.broadcast_and_wait()

Параметр

Описание

event

Имя ранее созданного объекта события.

# Move after the screen is pressed
move_event = Event()

def move_and_turn():
    robot.move_for(50, 0)
    robot.turn_for(RIGHT, 90)

move_event(move_and_turn)

while True:
    if robot.screen.pressing():
        move_event.broadcast_and_wait()
        break
robot.screen.print("Movement done.")