Események#
Bevezetés#
Az események lehetővé teszik egy függvény aszinkron indítását. Amikor egy eseményt sugároznak, az esemény visszahívó függvénye a saját feladatában (szálában) indul el, így a fő kód egyidejűleg folytathatja a futást.
Fontos: Egy event objektum egy visszahívást tárol. Ha egy másik függvényt regisztrálsz ugyanazzal az eseményobjektummal, az felülírja az előző visszahívást.
Ha azt szeretnéd, hogy egyetlen trigger hatására több dolog történjen, akkor a következők egyikét teheted:
Több segédfüggvény meghívása egyetlen visszahívásból, vagy
Használjon több eseményobjektumot, és mindegyiket szórja szét.
Használjon különálló threads szálakat a feladatok független futtatásához.
Esemény létrehozásához és használatához kövesse az alábbi lépéseket a megadott sorrendben:
Hozza létre az eseményt a
eventparaméterrel.Az esemény visszahívásának beállítása az esemény nevével (pl.:
myEvent(myCallback);).Broadcast an
event:broadcast— Egy eseményobjektum összes regisztrált függvényének párhuzamos futtatását indítja el.broadcastAndWait— Elindítja az eseményobjektum összes regisztrált függvényét, és a folytatás előtt megvárja, amíg befejeződnek.
Osztálykonstruktorok#
1 — Létrehoz egy
eventobjektumot visszahívó függvény nélkül.event();
2 — Létrehoz egy
eventobjektumot egy visszahívó függvénnyel.event( void (* callback)(void) );
3 — Egy másik eseményből egy visszahívó függvénnyel létrehoz egy
eventobjektumot.event( event v, void (* callback)(void) );
4 — Létrehoz egy
eventobjektumot egy argumentumot elfogadó visszahívó függvénnyel.event( void (* callback)(void *), void *arg );
5 — Létrehoz egy
eventobjektumot egy másik eseményből egy argumentumot elfogadó visszahívó függvénnyel.event( event v, void (* callback)(void *), void *arg );
Osztálydestruktor#
Megsemmisíti a event objektumot és felszabadítja a hozzá tartozó erőforrásokat.
~event();
Paraméterek#
Paraméter |
Típus |
Leírás |
|---|---|---|
|
|
Egy korábban definiált függvény, amely az esemény közvetítésekor kerül végrehajtásra. |
|
|
Egy meglévő eseményobjektum, amelyből másolni lehet. |
|
|
Egy függvény, amely void pointer argumentumot fogad el, és akkor hajtódik végre, amikor az esemény kisugárzódik. |
|
|
Egy mutató azokra az adatokra, amelyeket átadunk a visszahívó függvénynek. |
Megjegyzések#
Egy
eventobjektum egy visszahívást tárol. Ha egy másik függvényt regisztrálsz ugyanazzal az eseményobjektummal, az felülírja az előző visszahívást.Ha azt szeretnéd, hogy egyetlen trigger hatására több dolog történjen, akkor a következők egyikét teheted:
Több segédfüggvény meghívása egyetlen visszahívásból, vagy
Használjon több eseményobjektumot, és mindegyiket szórja szét.
Használjon külön szálakat a feladatok független futtatásához.
Példa#
Definiáljuk a visszahívó függvényt (
int main())// Create a callback function void onMyEvent() { Brain.Screen.print("Callback function executed!"); }Regisztrálja a visszahívást a
int main()függvényen belül.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); }
Tagfüggvények#
A event osztály a következő tagfüggvényeket tartalmazza:
operator— Beállít egy visszahívó függvényt az eseményhez.broadcast— Elindítja az esemény visszahívó függvényének párhuzamos futtatását.broadcastAndWait— Elindítja az esemény visszahívó függvényét, és megvárja a befejeződését.
Bármely event tagfüggvény meghívása előtt létre kell hozni egy event példányt, az alábbiak szerint:
/* 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#
Beállít egy visszahívó függvényt az eseményhez a függvényhívó operátor használatával.
Available Functionsvoid operator()( void (* callback)() );
Paraméter |
Típus |
Leírás |
|---|---|---|
|
|
Egy korábban definiált visszahívó függvény, amely automatikusan meghívódik az esemény sugárzásakor. A függvénynek meg kell egyeznie a szükséges visszahívó aláírással. További információkért lásd a Visszahívó függvények részt. |
Ez a függvény nem ad vissza értéket.
NotesA visszahívás újbóli beállítása felülírja az előző visszahívást.
A visszahívó függvénynek nem lehet paramétere, és void értéket kell visszaadnia.
Definiáljuk a visszahívó függvényeket (
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); }Regisztrálja a visszahívást a
int main()függvényen belül.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 elindítja az esemény visszahívását, és azonnal folytatódik.
void broadcast();
Ez a függvény nem fogad el paramétereket.
Return ValuesEz a függvény nem ad vissza értéket.
ExamplesDefiniáljuk a visszahívó függvényt (
int main())// Create a callback function void onMyEvent() { Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Event fired!"); }Regisztrálja a visszahívást a
int main()függvényen belül.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#
Elindítja a visszahívást, és megvárja, amíg befejeződik (vagy időtúllépés történik).
Available Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Paraméter |
Típus |
Leírás |
|---|---|---|
|
|
Az ezredmásodpercek száma, amelyet a kód újraindítása előtt várni kell (alapértelmezett érték 60000). |
Ez a függvény nem ad vissza értéket.
NotesCsak olyan visszahívásoknál használd ezt, amelyek véget érnek (végtelen ciklusok nélkül).
Ez egy várakozó függvény, amely blokkolja a végrehajtást, amíg a visszahívás be nem fejeződik, vagy időtúllépés történik.
Definiáljuk a visszahívó függvényt (
int main())// Create a callback function void startDriving() { Drivetrain.drive(forward); wait(2, seconds); }Regisztrálja a visszahívást a
int main()függvényen belül.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!"); }