Händelser#
Introduktion#
Händelser låter dig starta en funktion asynkront. När en händelse sänds startas händelsens callback-funktion i sin egen uppgift (tråd), så att din huvudkod kan fortsätta köras samtidigt.
Viktigt: Ett event objekt lagrar ett callback. Om du registrerar en annan funktion med samma eventobjekt ersätter det föregående callback-et.
Om du vill att flera saker ska hända från en och samma trigger, antingen:
Anropa flera hjälpfunktioner från ett enda återanrop, eller
Använd flera händelseobjekt och sänd ut vart och ett.
Använd separata trådar för att köra uppgifter oberoende av varandra.
För att skapa och sedan använda en händelse, följ dessa steg i ordning:
Skapa händelsen med
event.Ställ in händelsens återanrop med hjälp av händelsenamnet (t.ex.:
myEvent(myCallback);).Broadcast an
event:broadcast— Utlöser att alla registrerade funktioner i ett händelseobjekt körs parallellt.broadcastAndWait— Utlöser alla registrerade funktioner i ett händelseobjekt och väntar på att de ska slutföras innan den fortsätter.
Klasskonstruktörer#
1 — Skapar ett
eventobjekt utan en callback-funktion.event();
2 — Skapar ett
eventobjekt med en callback-funktion.event( void (* callback)(void) );
3 — Skapar ett
eventobjekt från en annan händelse med en callback-funktion.event( event v, void (* callback)(void) );
4 — Skapar ett
eventobjekt med en callback-funktion som accepterar ett argument.event( void (* callback)(void *), void *arg );
5 — Skapar ett
eventobjekt från en annan händelse med en callback-funktion som accepterar ett argument.event( event v, void (* callback)(void *), void *arg );
Klassförstörare#
Förstör event objektet och frigör tillhörande resurser.
~event();
Parametrar#
Parameter |
Typ |
Beskrivning |
|---|---|---|
|
|
En funktion som tidigare har definierats att köras när händelsen sänds. |
|
|
Ett befintligt händelseobjekt att kopiera från. |
|
|
En funktion som accepterar ett void-pekarargument och körs när händelsen sänds. |
|
|
En pekare till data som kommer att skickas till callback-funktionen. |
Anteckningar#
Ett
eventobjekt lagrar ett callback. Om du registrerar en annan funktion med samma eventobjekt ersätter det det föregående callback-et.Om du vill att flera saker ska hända från en och samma trigger, antingen:
Anropa flera hjälpfunktioner från ett enda återanrop, eller
Använd flera händelseobjekt och sänd ut vart och ett.
Använd separata trådar för att köra uppgifter oberoende av varandra.
Exempel#
// 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);
}
Medlemsfunktioner#
Klassen event innehåller följande medlemsfunktioner:
operator— Ställer in en återuppringningsfunktion för händelsen.broadcast— Utlöser att händelsens återanropsfunktion körs parallellt.broadcastAndWait— Utlöser händelsens återuppringningsfunktion och väntar på att den är klar.
Innan några event medlemsfunktioner anropas måste en event instans skapas, som visas nedan:
/* 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#
Ställer in en callback-funktion för händelsen med hjälp av funktionens anropsoperator.
Available Functionsvoid operator()( void (* callback)() );
Parameter |
Typ |
Beskrivning |
|---|---|---|
|
|
En tidigare definierad återuppringningsfunktion som anropas automatiskt när händelsen sänds. Funktionen måste matcha den erforderliga återuppringningssignaturen. Se Återuppringningsfunktioner för mer information. |
Den här funktionen returnerar inget värde.
NotesAtt ställa in en återuppringning ersätter den föregående återuppringningen.
Återanropsfunktionen får inte ha några parametrar och returnera 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 startar händelsens återuppringning och fortsätter omedelbart.
void broadcast();
Den här funktionen tar inga parametrar.
Return ValuesDen här funktionen returnerar inget värde.
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#
Startar återuppringningen och väntar tills den är klar (eller tidsgränsen överskrids).
Available Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Parameter |
Typ |
Beskrivning |
|---|---|---|
|
|
Antalet millisekunder som ska väntas innan koden börjar köras igen (standardvärdet är 60000). |
Den här funktionen returnerar inget värde.
NotesAnvänd endast detta med återanrop som slutar (inga oändliga loopar).
Detta är en väntefunktion som blockerar körningen tills återanropet är klart eller tidsgränsen uppnås.
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!");
}