Evenementen#
Invoering#
Met behulp van events kun je een functie asynchroon starten. Wanneer een event wordt uitgezonden, wordt de callback-functie van het event in een eigen taak (thread) gestart, zodat je hoofdcode tegelijkertijd kan blijven draaien.
Belangrijk: Een event-object met event waarden slaat één callbackfunctie op. Als u een andere functie registreert met hetzelfde event-object, vervangt deze de vorige callbackfunctie.
Als je wilt dat er meerdere dingen gebeuren als gevolg van één trigger, dan kun je het volgende doen:
Roep meerdere hulpfuncties aan vanuit één callback, of
Gebruik meerdere gebeurtenisobjecten en zend ze allemaal uit.
Gebruik aparte threads om taken onafhankelijk van elkaar uit te voeren.
Om een evenement aan te maken en te gebruiken, volg je deze stappen in de juiste volgorde:
Maak het evenement aan met
event.Stel de callback van de gebeurtenis in met behulp van de gebeurtenisnaam (bijv.:
myEvent(myCallback);).Broadcast an
event:broadcast— Activeert alle geregistreerde functies in een gebeurtenisobject om parallel te worden uitgevoerd.broadcastAndWait— Activeert alle geregistreerde functies in een gebeurtenisobject en wacht tot ze klaar zijn voordat verder wordt gegaan.
Klasseconstructors#
1 — Maakt een
eventobject aan zonder callback-functie.event();
2 — Maakt een
eventobject aan met een callbackfunctie.event( void (* callback)(void) );
3 — Maakt een
eventobject aan op basis van een ander event met een callback-functie.event( event v, void (* callback)(void) );
4 — Maakt een
eventobject aan met een callbackfunctie die een argument accepteert.event( void (* callback)(void *), void *arg );
5 — Maakt een
eventobject aan op basis van een ander event met een callbackfunctie die een argument accepteert.event( event v, void (* callback)(void *), void *arg );
Klasse-destructor#
Vernietigt het event object en geeft de bijbehorende resources vrij.
~event();
Parameters#
Parameter |
Type |
Beschrijving |
|---|---|---|
|
|
Een functie die vooraf is gedefinieerd en die wordt uitgevoerd wanneer de gebeurtenis wordt uitgezonden. |
|
|
Een bestaand gebeurtenisobject om van te kopiëren. |
|
|
Een functie die een void-pointerargument accepteert en wordt uitgevoerd wanneer de gebeurtenis wordt uitgezonden. |
|
|
Een verwijzing naar de gegevens die aan de callbackfunctie worden doorgegeven. |
Notities#
Een event-object met
eventwaarden slaat één callbackfunctie op. Als je een andere functie registreert met hetzelfde event-object, vervangt deze de vorige callbackfunctie.Als je wilt dat er meerdere dingen gebeuren als gevolg van één trigger, dan kun je het volgende doen:
Roep meerdere hulpfuncties aan vanuit één callback, of
Gebruik meerdere gebeurtenisobjecten en zend ze allemaal uit.
Gebruik aparte threads om taken onafhankelijk van elkaar uit te voeren.
Voorbeeld#
// 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);
}
Lidfuncties#
De klasse event bevat de volgende lidfuncties:
operator— Stelt een callbackfunctie in voor de gebeurtenis.broadcast— Activeert de callbackfunctie van de gebeurtenis om parallel te worden uitgevoerd.broadcastAndWait— Activeert de callbackfunctie van de gebeurtenis en wacht op voltooiing.
Voordat er lidfuncties van gebeurtenis event kunnen worden aangeroepen, moet er een instantie van gebeurtenis event worden aangemaakt, zoals hieronder wordt weergegeven:
/* 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#
Stelt een callbackfunctie in voor de gebeurtenis met behulp van de functieaanroepoperator.
Available Functionsvoid operator()( void (* callback)() );
Parameter |
Type |
Beschrijving |
|---|---|---|
|
|
Een eerder gedefinieerde callbackfunctie die automatisch wordt aangeroepen wanneer de gebeurtenis wordt uitgezonden. De functie moet overeenkomen met de vereiste callbacksignatuur. Zie Callbackfuncties voor meer informatie. |
Deze functie retourneert geen waarde.
NotesHet opnieuw instellen van een callback vervangt de vorige callback.
De callbackfunctie mag geen parameters hebben en moet void retourneren.
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 start de callback van het evenement en gaat direct verder.
void broadcast();
Deze functie accepteert geen parameters.
Return ValuesDeze functie retourneert geen waarde.
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#
Start de callback en wacht tot deze is voltooid (of tot de time-out is bereikt).
Available Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Parameter |
Type |
Beschrijving |
|---|---|---|
|
|
Het aantal milliseconden dat gewacht moet worden voordat de code opnieuw wordt uitgevoerd (standaardwaarde: 60000). |
Deze functie retourneert geen waarde.
NotesGebruik dit alleen met callbacks die eindigen (geen oneindige lussen).
Dit is een wachtfunctie die de uitvoering blokkeert totdat de callback is voltooid of de time-out is bereikt.
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!");
}