Eventos#

Introdução#

Os eventos permitem executar funções em paralelo utilizando objetos de evento. Em vez de chamar funções ou threads uma após a outra, os eventos permitem registar funções e acioná-las simultaneamente. Cada função registada é executada no seu próprio thread, permitindo que o seu robô realize várias tarefas — como piscar LEDs sensíveis ao toque e movimentar-se — ao mesmo tempo.

Segue-se uma lista dos métodos e construtores disponíveis:

  • Event – Cria um novo objeto de evento.

  • broadcast – Aciona todas as funções registadas num objeto de evento para serem executadas em paralelo.

  • broadcast_and_wait – Aciona todas as funções registadas num objeto de evento e espera que terminem antes de continuar.

  • event – Regista uma função no objeto de evento, opcionalmente com argumentos.

Create an Event Object#

Event cria um objeto de evento que gere a execução de funções em threads separados.

Usage:
Event()

Parâmetro

Descrição

Este construtor não possui parâmetros.

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#

O comando broadcast dispara um evento, iniciando todas as funções registadas em threads separados. Este método não pausa a execução de nenhuma função subsequente.

Usage:
my_event.broadcast()

Parâmetro

Descrição

event

O nome do objeto de evento criado anteriormente.

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 inicia um evento, mas espera que todas as funções registadas terminem antes de continuar com as funções subsequentes.

Usage:
my_event.broadcast_and_wait()

Parâmetro

Descrição

event

O nome do objeto de evento criado anteriormente.

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#

Ao registar uma função para um evento, esta será executada num thread separado quando o evento for transmitido.

Usage:
event(callback, args)

Parâmetro

Descrição

event

O nome do objeto de evento criado anteriormente.

callback

Uma função previamente definida para ser executada quando o evento é transmitido.

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)