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#
Definiera callback-funktionen (utanför
int main())// Create a callback function void onMyEvent() { Brain.Screen.print("Callback function executed!"); }Registrera återuppringningen inuti
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); }
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.
Definiera callback-funktionerna (utanför
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); }Registrera återuppringningen inuti
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 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.
ExamplesDefiniera callback-funktionen (utanför
int main())// Create a callback function void onMyEvent() { Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Event fired!"); }Registrera återuppringningen inuti
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#
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.
Definiera callback-funktionen (utanför
int main())// Create a callback function void startDriving() { Drivetrain.drive(forward); wait(2, seconds); }Registrera återuppringningen inuti
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!"); }