Eventos#
Introducción#
Los eventos permiten iniciar una función de forma asíncrona. Cuando se emite un evento, la función de devolución de llamada del evento se inicia en su propia tarea (hilo), de modo que el código principal puede seguir ejecutándose simultáneamente.
Importante: Un objeto de evento almacena una de devolución de llamada. Si registra otra función con el mismo objeto de evento, esta reemplazará la función de devolución de llamada anterior.
Si quieres que ocurran varias cosas a partir de un mismo desencadenante, puedes:
Llamar a varias funciones auxiliares desde una única función de devolución de llamada, o
Utilice varios objetos de evento y transmita cada uno de ellos.
Utilice hilos separados para ejecutar tareas de forma independiente.
Para crear y luego usar un evento, siga estos pasos en orden:
Crea el evento con
evento.Establezca la función de devolución de llamada del evento usando el nombre del evento (ej:
myEvent(myCallback);).Broadcast an
event:difusión— 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 terminen antes de continuar.
Constructores de clases#
1 — Crea un objeto
eventosin una función de devolución de llamada.event();
2 — Crea un objeto
eventocon una función de devolución de llamada.event( void (* callback)(void) );
3 — Crea un objeto
eventoa partir de otro evento con una función de devolución de llamada.event( event v, void (* callback)(void) );
4 — Crea un objeto
eventocon una función de devolución de llamada que acepta un argumento.event( void (* callback)(void *), void *arg );
5 — Crea un objeto
eventoa 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 );
Instructor de clase#
Destruye el objeto evento y libera los recursos asociados.
~event();
Parámetros#
Parámetro |
Tipo |
Descripción |
|---|---|---|
|
|
Una función que se define previamente para ejecutarse cuando se transmite el evento. |
|
|
Un objeto de evento existente del que copiar. |
|
|
Una función que acepta un argumento de puntero vacío y se ejecuta cuando se transmite el evento. |
|
|
Un puntero a los datos que se pasarán a la función de devolución de llamada. |
Notas#
Un objeto evento
almacena una función de devolución de llamada. Si registra otra función con el mismo objeto de evento, esta reemplaza la función de devolución de llamada anterior.Si quieres que ocurran varias cosas a partir de un mismo desencadenante, puedes:
Llamar a varias funciones auxiliares desde una única función de devolución de llamada, o
Utilice varios objetos de evento y transmita cada uno de ellos.
Utilice hilos separados para ejecutar las 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!");
}
Registra la función de 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 evento incluye las siguientes funciones miembro:
operador — Establece una función de devolución de llamada para el evento.
transmisión — 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.
Antes de llamar a cualquier función miembro se debe crear una instancia como se muestra a continuación:
/* 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 a 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 definida previamente que se ejecuta 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 ningún valor.
Notes
Al volver a configurar una función de devolución de llamada, se reemplaza la función de devolución de llamada anterior.
La función de devolución de llamada no debe tener parámetros y debe devolver void.
Examples
Defina 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);
}
Registra la función de 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#
broadcast inicia la devolución de llamada del evento y continúa inmediatamente.
Member Functions
void broadcast();
Parameters
Esta función no requiere ningún parámetro.
Return Values
Esta función no devuelve ningún 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!");
}
Registra la función de 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 función de devolución de llamada y espera hasta que finalice (o se agote el tiempo de espera).
Available Functions
void broadcastAndWait( int32_t timeout = 60000 );
Parameters
Parámetro
Tipo
Descripción
timeout
int32_t
Cantidad de milisegundos que se deben esperar antes de que el código vuelva a ejecutarse (el valor predeterminado es 60000).
Return Values
Esta función no devuelve ningún valor.
Notes
Utilice esto únicamente con funciones de devolución de llamada que finalicen (sin bucles infinitos).
Se trata de una función de espera que bloquea la ejecución hasta que la función de devolución de llamada finaliza o se agota 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);
}
Registra la función de 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!");
}