Eventos#

Introducción#

Los eventos le permiten iniciar una función de forma asíncrona. Cuando se transmite un evento, la función de devolución de llamada del evento se inicia en su propia tarea (hilo), por lo que su código principal puede continuar ejecutándose al mismo tiempo.

Important: An event object stores one callback. If you register another function with the same event object, it replaces the previous callback.

Si quieres que sucedan varias cosas de un solo desencadenante, ya sea:

  • Llamar a múltiples funciones auxiliares desde una sola devolución de llamada, o

  • Usa varios objetos de evento y transmite cada uno.

  • Utilice hilos separados para ejecutar tareas de forma independiente.

Para crear y luego usar un Evento, siga estos pasos en orden:

  1. Crea el evento con event.

  2. Establecer la devolución de llamada del evento usando el nombre del evento (por ejemplo myEvent(myCallback);).

  3. Broadcast an event:

    • broadcast: activa todas las funciones registradas en un objeto de evento para que se ejecuten en paralelo.

    • broadcastAndWait: activa todas las funciones registradas en un objeto de evento y espera a que finalicen antes de continuar.

Constructores de clase#

1 — Crea un objeto event sin una función de devolución de llamada.

event();

2 — Crea un objeto event con una función de devolución de llamada.

event( void (* callback)(void) );

3 — Crea un objeto event a partir de otro evento con una función de devolución de llamada.

event( 
  event v, 
  void (* callback)(void) );

4 — Crea un objeto event con una función de devolución de llamada que acepta un argumento.

event( void (* callback)(void *), void *arg );

5 — Crea un objeto event a partir de otro evento con una función de devolución de llamada que acepta un argumento.

event( event v, void (* callback)(void *), void *arg );

Destructor de clase#

Destruye el objeto event y libera los recursos asociados.

~event();

Parámetros#

Parámetro

Tipo

Descripción

callback

void (*)(void)

Una función que se define previamente para ejecutarse cuando se emite el evento.

v

event

Un objeto de evento existente para copiar.

callback

void (*)(void *)

Una función que acepta un argumento de puntero vacío y se ejecuta cuando se transmite el evento.

arg

void *

Un puntero a los datos que se pasarán a la función de devolución de llamada.

Observaciones#

  • An event object stores one callback. If you register another function with the same event object, it replaces the previous callback.

  • Si quieres que sucedan varias cosas de un solo desencadenante, ya sea:

    • Llamar a múltiples funciones auxiliares desde una sola devolución de llamada, o

    • Usa varios objetos de evento y transmite cada uno.

    • Utilice hilos separados para ejecutar tareas de forma independiente.

Ejemplo#

Defina la función de devolución de llamada (fuera de int main())

// Create a callback function
void onMyEvent() {
  Brain.Screen.print("Callback function executed!");
}

Registrar la devolución de llamada dentro de int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  // Create an event called myEvent
  // Set onMyEvent as the callback function
  event myEvent(onMyEvent);
}

Funciones de los miembros#

La clase event incluye las siguientes funciones miembro:

  • operator — Establece una función de devolución de llamada para el evento.

  • broadcast — Activa la función de devolución de llamada del evento para que se ejecute en paralelo.

  • broadcastAndWait: activa la función de devolución de llamada del evento y espera a que se complete.

Before calling any event member functions, an event instance must be created, as shown below:

/* This constructor is required when using VS Code.
Event configuration can be created with or without
a callback function as shown in the examples above. */

// Create an event without a callback
event myEvent;

// Or create an event with a callback
event myEvent(onMyEvent);

operator#

Establece una función de devolución de llamada para el evento utilizando el operador de llamada de función.

Available Functions
void operator()( void (* callback)() );

Parameters

Parámetro

Tipo

Descripción

callback

void (*)(void)

Una función de devolución de llamada previamente definida que se llama automáticamente cuando se transmite el evento. La función debe coincidir con la firma de devolución de llamada requerida. Consulte Funciones de devolución de llamada para obtener más información.

Return Values

Esta función no devuelve un valor.

Notes
  • Establecer una devolución de llamada nuevamente reemplaza la devolución de llamada anterior.

  • La función de devolución de llamada no debe tener parámetros y devuelve void.

Examples

Definir las funciones de devolución de llamada (fuera de int main())

// Create a callback function
void drawSquare() {
  Brain.Screen.clearScreen();
  Brain.Screen.drawRectangle(40, 40, 120, 120);
}

void drawCircle() {
  Brain.Screen.clearScreen();
  Brain.Screen.drawCircle(100, 100, 60);
}

Registrar la devolución de llamada dentro de int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  // Create the event drawEvent
  event drawEvent;

  Brain.Screen.print("Drawing a square...");

  // Set the event to drawSquare
  drawEvent(drawSquare);

  wait(1, seconds);

  // Trigger the event
  drawEvent.broadcast();

  wait(1, seconds);

  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Drawing a circle...");

  // Replace drawSquare with drawCircle
  drawEvent(drawCircle);

  wait(1, seconds);

  // Trigger the event a second time
  drawEvent.broadcast();
}

broadcast#

la broadcast inicia la devolución de llamada del evento y continúa de inmediato.

Member Functions
void broadcast();

Parameters

Esta función no toma ningún parámetro.

Return Values

Esta función no devuelve un valor.

Examples

Defina la función de devolución de llamada (fuera de int main())

// Create a callback function
void onMyEvent() {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Event fired!");
}

Registrar la devolución de llamada dentro de int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  Brain.Screen.print("Broadcasting in 2 seconds...");

  // Create an event called myEvent
  // Set onMyEvent as the callback function
  event myEvent(onMyEvent);

  wait(2, seconds);

  // Trigger the event
  myEvent.broadcast();
}

broadcastAndWait#

Inicia la devolución de llamada y espera hasta que termine (o se agote el tiempo de espera).

Available Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Parámetro

Tipo

Descripción

timeout

int32_t

La cantidad de milisegundos que hay que esperar antes de que el código comience a ejecutarse de nuevo (por defecto es 60000).

Return Values

Esta función no devuelve un valor.

Notes
  • Utilice esto solo con devoluciones de llamada que terminen (sin bucles infinitos).

  • Esta es una función de espera que bloquea la ejecución hasta que se complete la devolución de llamada o se agote el tiempo de espera.

Examples

Defina la función de devolución de llamada (fuera de int main())

// Create a callback function
void startDriving() {
  Drivetrain.drive(forward);
  wait(2, seconds);
}

Registrar la devolución de llamada dentro de int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  Brain.Screen.print("Starting drive...");

  event driveEvent(startDriving);
  // Give the event time to be set
  wait(0.25, seconds);

  // Run the event and wait until it finishes
  driveEvent.broadcastAndWait();

  // Stop driving after 2 seconds
  Drivetrain.stop();
  Brain.Screen.clearScreen();
  Brain.Screen.print("Drive complete!");
}