События#

Введение#

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

Ниже приведён список доступных методов и конструкторов:

  • 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()

Параметр

Описание

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 and wait#

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

Usage:
my_event.broadcast_and_wait()

Параметр

Описание

event

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

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)

Параметр

Описание

event

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

callback

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

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)