Eventos#
Introducción#
Los eventos permiten iniciar una función de forma asíncrona. Cuando se transmite un evento, su función de devolución de llamada se inicia en su propia tarea (hilo), de modo que el código principal puede seguir ejecutándose simultáneamente.
Important: An event object stores one callback. If you register another function with the same event object, it replaces the previous callback.
Si desea que sucedan varias cosas a partir de un disparador, puede:
Llamar a múltiples funciones auxiliares desde una única devolución de llamada, o
Utilice múltiples objetos de evento y transmita cada uno de ellos.
Utilice subprocesos separados para ejecutar tareas de forma independiente.
Para crear y luego utilizar un Evento, siga estos pasos en orden:
Create the event with
event.Set the event’s callback using the event name (ex:
myEvent(myCallback);).Broadcast an
event:broadcast— Triggers all registered functions in an event object to run in parallel.broadcastAndWait— Triggers all registered functions in an event object and waits for them to finish before continuing.
Crear un evento#
The event constructor creates an event object. You can create an event with or without a callback.
Default Usage:
event myEvent;
Overload Usages:
event myEvent(callback);
Parámetro |
Descripción |
|---|---|
|
El nombre del evento. |
|
Una función que se define previamente para ejecutarse cuando se transmite el evento. |
// Create a callback function
void onMyEvent() {
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
Brain.Screen.print("Event fired!");
}
int main() {
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();
}
Establecer una devolución de llamada a un evento#
Establecer una devolución de llamada significa que la función se ejecutará cuando se transmita el evento.
Nota: Al configurar una devolución de llamada nuevamente se reemplaza la devolución de llamada anterior.
Usage:
eventName(callback);
Parámetro |
Descripción |
|---|---|
|
El nombre del objeto de evento creado previamente. |
|
Una función de devolución de llamada previamente definida que se llama automáticamente al transmitir 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. |
void drawSquare() {
Brain.Screen.clearScreen();
Brain.Screen.drawRectangle(40, 40, 120, 120);
}
void drawCircle() {
Brain.Screen.clearScreen();
Brain.Screen.drawCircle(100, 100, 60);
}
int main() {
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();
}
Transmitir un evento#
broadcast#
broadcast starts the event’s callback and continues immediately.
Usage:
myEvent.broadcast();
Parámetro |
Descripción |
|---|---|
|
El nombre del objeto de evento creado previamente. |
// Create a callback function
void onMyEvent() {
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1)
Brain.Screen.print("Event fired!");
}
int main() {
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#
broadcastAndWait starts the callback and waits until it finishes (or times out).
Nota: Use esto solo con devoluciones de llamadas que finalicen (sin bucles infinitos).
Usage:
myEvent.broadcastAndWait(timeout);
Parámetro |
Descripción |
|---|---|
|
El nombre del objeto de evento creado previamente. |
|
La cantidad de milisegundos a esperar como doble antes de que el código comience a ejecutarse nuevamente. |
void startDriving() {
Drivetrain.drive(forward);
wait(2, seconds);
}
int main() {
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!");
}