Eventos#
Introdução#
Os eventos permitem iniciar uma função de forma assíncrona. Quando um evento é transmitido, a função de callback do evento é iniciada na sua própria tarefa (thread), permitindo que o seu código principal continue a ser executado em simultâneo.
Importante: Um objeto de evento event armazena um callback. Se registar outra função com o mesmo objeto de evento, esta substituirá o retorno de chamada anterior.
Se pretende que várias coisas aconteçam a partir de um único gatilho, pode:
Chamar várias funções auxiliares a partir de um único callback, ou
Utilize múltiplos objetos de evento e transmita cada um deles.
Use separate threads to run tasks independently.
Para criar e utilizar um evento, siga os seguintes passos pela ordem indicada:
Crie o evento com
event.Defina o callback do evento utilizando o nome do evento (ex:
myEvent(myCallback);).Broadcast an
event:broadcast— Aciona todas as funções registadas num objeto de evento para serem executadas em paralelo.broadcastAndWait— Aciona todas as funções registadas num objeto de evento e espera que terminem antes de continuar.
Construtores de Classes#
1 — Cria um objeto com
eventelemento sem função de callback.event();
2 — Cria um objeto com
eventfunção de callback.event( void (* callback)(void) );
3 — Cria um objeto de evento
eventa partir de outro evento com uma função de callback.event( event v, void (* callback)(void) );
4 — Creates an
eventobject with a callback function that accepts an argument.event( void (* callback)(void *), void *arg );
5 — Cria um objeto de evento
eventa partir de outro evento com uma função de callback que aceita um argumento.event( event v, void (* callback)(void *), void *arg );
Destrutor de classes#
Destroys the event object and releases associated resources.
~event();
Parâmetros#
Parâmetro |
Tipo |
Descrição |
|---|---|---|
|
|
Uma função previamente definida para ser executada quando o evento é transmitido. |
|
|
Um objeto de evento existente para copiar. |
|
|
Uma função que aceita um argumento ponteiro void e é executada quando o evento é transmitido. |
|
|
Um ponteiro para os dados que serão passados para a função de callback. |
Notas#
An
eventobject stores one callback. If you register another function with the same event object, it replaces the previous callback.Se pretende que várias coisas aconteçam a partir de um único gatilho, pode:
Chamar várias funções auxiliares a partir de um único callback, ou
Utilize múltiplos objetos de evento e transmita cada um deles.
Utilize threads separados para executar tarefas de forma independente.
Exemplo#
// Create a callback function
void onMyEvent() {
Brain.Screen.print("Callback function executed!");
}
int main() {
// Create an event called myEvent and set onMyEvent
// as the callback function.
event myEvent(onMyEvent);
}
Funções de membro#
A classe event inclui as seguintes funções membro:
operator— Define uma função de chamada de retorno para o evento.broadcast— Aciona a função de callback do evento para ser executada em paralelo.broadcastAndWait— Aciona a função de callback do evento e aguarda a sua conclusão.
Antes de chamar qualquer função membro do evento event ), deve ser criada uma instância do evento event , como se mostra abaixo:
/* 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#
Define uma função de retorno de chamada para o evento utilizando o operador de chamada de função.
Available Functionsvoid operator()( void (* callback)() );
Parâmetro |
Tipo |
Descrição |
|---|---|---|
|
|
Uma função de chamada de retorno previamente definida que é chamada automaticamente quando o evento é transmitido. A função deve corresponder à assinatura de retorno de chamada necessária. Consulte Funções de retorno de chamada para obter mais informações. |
Esta função não devolve qualquer valor.
NotesA definição de uma função de retorno de chamada novamente substitui a função de retorno de chamada anterior.
A função de retorno de chamada não deve ter parâmetros e deve retornar void.
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() {
// 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 o retorno de chamada do evento e continua imediatamente.
void broadcast();
Esta função não recebe qualquer parâmetro.
Return ValuesEsta função não devolve qualquer valor.
Examples// Create a callback function.
void onMyEvent() {
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
Brain.Screen.print("Event fired!");
}
int main() {
Brain.Screen.print("Broadcasting in 2 seconds...");
// Create an event called myEvent and set onMyEvent
// as the callback function.
event myEvent(onMyEvent);
wait(2, seconds);
// Trigger the event.
myEvent.broadcast();
}
broadcastAndWait#
Inicia a função de retorno de chamada e aguarda até que esta termine (ou atinja o tempo limite).
Available Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Parâmetro |
Tipo |
Descrição |
|---|---|---|
|
|
A quantidade de milissegundos a aguardar antes que o código comece a ser executado novamente (o predefinido é 60000). |
Esta função não devolve qualquer valor.
NotesUtilize isto apenas com funções de callback que terminam (sem loops infinitos).
Esta é uma função de espera que bloqueia a execução até que o retorno de chamada esteja concluído ou o tempo limite expire.
void startDriving() {
Drivetrain.drive(forward);
wait(2, seconds);
}
int main() {
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!");
}