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#
// 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);
}
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.
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 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.
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#
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.
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!");
}