Veranstaltungen#
Einführung#
Ereignisse ermöglichen es Ihnen, eine Funktion asynchron zu starten. Wenn ein Ereignis ausgelöst wird, wird die Callback-Funktion des Ereignisses in einem eigenen Task (Thread) gestartet, sodass Ihr Hauptcode gleichzeitig weiter ausgeführt werden kann.
Wichtig: Ein event Objekt speichert genau eine Callback-Funktion. Wenn Sie eine weitere Funktion mit demselben Ereignisobjekt registrieren, ersetzt diese die vorherige Callback-Funktion.
Wenn Sie möchten, dass mehrere Dinge durch einen einzigen Auslöser geschehen, haben Sie folgende Möglichkeiten:
Mehrere Hilfsfunktionen aus einem einzigen Callback aufrufen, oder
Verwenden Sie mehrere Ereignisobjekte und senden Sie jedes einzelne an die Öffentlichkeit.
Verwenden Sie separate Threads, um Aufgaben unabhängig voneinander auszuführen.
Um ein Ereignis zu erstellen und anschließend zu verwenden, befolgen Sie diese Schritte in dieser Reihenfolge:
Erstelle das Ereignis mit
event.Setzen Sie die Rückruffunktion des Ereignisses mithilfe des Ereignisnamens (z. B.:
myEvent(myCallback);).Broadcast an
event:broadcast— Löst aus, dass alle registrierten Funktionen in einem Ereignisobjekt parallel ausgeführt werden.broadcastAndWait— Löst alle registrierten Funktionen in einem Ereignisobjekt aus und wartet, bis diese abgeschlossen sind, bevor fortgefahren wird.
Klassenkonstruktoren#
1 — Erstellt ein
eventObjekt ohne Callback-Funktion.event();
2 — Erstellt ein
eventObjekt mit einer Callback-Funktion.event( void (* callback)(void) );
3 — Erzeugt ein
eventObjekt aus einem anderen Ereignis mit einer Callback-Funktion.event( event v, void (* callback)(void) );
4 — Erstellt ein
eventObjekt mit einer Callback-Funktion, die ein Argument akzeptiert.event( void (* callback)(void *), void *arg );
5 — Erzeugt ein
eventObjekt aus einem anderen Ereignis mit einer Rückruffunktion, die ein Argument akzeptiert.event( event v, void (* callback)(void *), void *arg );
Klassendestruktor#
Zerstört das Ereignisobjekt event zugehörigen Ressourcen frei.
~event();
Parameter#
Parameter |
Typ |
Beschreibung |
|---|---|---|
|
|
Eine Funktion, die zuvor definiert wurde und ausgeführt werden soll, wenn das Ereignis übertragen wird. |
|
|
Ein vorhandenes Ereignisobjekt zum Kopieren. |
|
|
Eine Funktion, die einen Void-Pointer als Argument akzeptiert und ausgeführt wird, wenn das Ereignis übertragen wird. |
|
|
Ein Zeiger auf Daten, die an die Callback-Funktion übergeben werden. |
Anmerkungen#
Ein
eventObjekt speichert genau eine Callback-Funktion. Wenn Sie eine weitere Funktion mit demselben Ereignisobjekt registrieren, ersetzt diese die vorherige Callback-Funktion.Wenn Sie möchten, dass mehrere Dinge durch einen einzigen Auslöser geschehen, haben Sie folgende Möglichkeiten:
Mehrere Hilfsfunktionen aus einem einzigen Callback aufrufen, oder
Verwenden Sie mehrere Ereignisobjekte und senden Sie jedes einzelne an die Öffentlichkeit.
Verwenden Sie separate Threads, um Aufgaben unabhängig voneinander auszuführen.
Beispiel#
Definiere die Callback-Funktion (außerhalb von
int main())// Create a callback function void onMyEvent() { Brain.Screen.print("Callback function executed!"); }Registriere den Callback innerhalb von
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); }
Mitgliedsfunktionen#
Die Klasse event enthält die folgenden Memberfunktionen:
operator— Legt eine Rückruffunktion für das Ereignis fest.broadcast— Löst aus, dass die Callback-Funktion des Ereignisses parallel ausgeführt wird.broadcastAndWait— Löst die Callback-Funktion des Ereignisses aus und wartet auf deren Abschluss.
Bevor event Memberfunktionen aufgerufen werden können, muss eine event Instanz erstellt werden, wie unten dargestellt:
/* 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#
Legt mithilfe des Funktionsaufrufoperators eine Rückruffunktion für das Ereignis fest.
Available Functionsvoid operator()( void (* callback)() );
Parameter |
Typ |
Beschreibung |
|---|---|---|
|
|
Eine zuvor definierte Callback-Funktion, die automatisch aufgerufen wird, wenn das Ereignis übertragen wird. Die Funktion muss der erforderlichen Callback-Signatur entsprechen. Weitere Informationen finden Sie unter Callback-Funktionen. |
Diese Funktion gibt keinen Wert zurück.
NotesDas erneute Festlegen einer Callback-Funktion ersetzt die vorherige Callback-Funktion.
Die Callback-Funktion darf keine Parameter haben und muss void zurückgeben.
Definiere die Callback-Funktionen (außerhalb von
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); }Registriere den Callback innerhalb von
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 startet den Rückruf des Ereignisses und wird sofort fortgesetzt.
void broadcast();
Diese Funktion benötigt keine Parameter.
Return ValuesDiese Funktion gibt keinen Wert zurück.
ExamplesDefiniere die Callback-Funktion (außerhalb von
int main())// Create a callback function void onMyEvent() { Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Event fired!"); }Registriere den Callback innerhalb von
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#
Startet den Callback und wartet, bis er beendet ist (oder ein Timeout auftritt).
Available Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Parameter |
Typ |
Beschreibung |
|---|---|---|
|
|
Die Anzahl der Millisekunden, die gewartet werden soll, bevor der Code erneut ausgeführt wird (Standardwert: 60000). |
Diese Funktion gibt keinen Wert zurück.
NotesVerwenden Sie dies nur mit Callbacks, die beendet werden (keine Endlosschleifen).
Dies ist eine Wartefunktion, die die Ausführung blockiert, bis der Callback abgeschlossen ist oder ein Timeout auftritt.
Definiere die Callback-Funktion (außerhalb von
int main())// Create a callback function void startDriving() { Drivetrain.drive(forward); wait(2, seconds); }Registriere den Callback innerhalb von
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!"); }