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:

  1. Hozza létre az eseményt a event paraméterrel.

  2. Az esemény visszahívásának beállítása az esemény nevével (pl.: myEvent(myCallback);).

  3. 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 event objektumot visszahívó függvény nélkül.

event();

2 — Létrehoz egy event objektumot 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 event objektumot.

event( 
  event v, 
  void (* callback)(void) );

4 — Létrehoz egy event objektumot egy argumentumot elfogadó visszahívó függvénnyel.

event( void (* callback)(void *), void *arg );

5 — Létrehoz egy event objektumot 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

callback

void (*)(void)

Egy korábban definiált függvény, amely az esemény közvetítésekor kerül végrehajtásra.

v

event

Egy meglévő eseményobjektum, amelyből másolni lehet.

callback

void (*)(void *)

Egy függvény, amely void pointer argumentumot fogad el, és akkor hajtódik végre, amikor az esemény kisugárzódik.

arg

void *

Egy mutató azokra az adatokra, amelyeket átadunk a visszahívó függvénynek.

Megjegyzések#

  • 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 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 Functions
void operator()( void (* callback)() );

Parameters

Paraméter

Típus

Leírás

callback

void (*)(void)

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.

Return Values

Ez a függvény nem ad vissza értéket.

Notes
  • A 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.

Examples

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.

Member Functions
void broadcast();

Parameters

Ez a függvény nem fogad el paramétereket.

Return Values

Ez a függvény nem ad vissza értéket.

Examples

Definiá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 Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Paraméter

Típus

Leírás

timeout

int32_t

Az ezredmásodpercek száma, amelyet a kód újraindítása előtt várni kell (alapértelmezett érték 60000).

Return Values

Ez a függvény nem ad vissza értéket.

Notes
  • Csak 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.

Examples

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