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 (
event) 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#
Definieer de callbackfunctie (buiten
int main())// Create a callback function void onMyEvent() { Brain.Screen.print("Callback function executed!"); }Registreer de callback binnen
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); }
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.
Definieer de callbackfuncties (buiten
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); }Registreer de callback binnen
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 start de callback van het evenement en gaat direct verder.
void broadcast();
Deze functie accepteert geen parameters.
Return ValuesDeze functie retourneert geen waarde.
ExamplesDefinieer de callbackfunctie (buiten
int main())// Create a callback function void onMyEvent() { Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Event fired!"); }Registreer de callback binnen
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#
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.
Definieer de callbackfunctie (buiten
int main())// Create a callback function void startDriving() { Drivetrain.drive(forward); wait(2, seconds); }Registreer de callback binnen
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!"); }