Události#

Zavedení#

Události umožňují asynchronní spuštění funkce. Když je událost vysílána, callback funkce události se spustí ve vlastním úkolu (vlákně), takže váš hlavní kód může pokračovat v běhu současně.

Důležité: Objekt události event ukládá jedno zpětné volání. Pokud zaregistrujete jinou funkci se stejným objektem události, tato nahradí předchozí zpětné volání.

Pokud chcete, aby se z jednoho spouštěče dělo více věcí, buď:

  • Volání více pomocných funkcí z jednoho zpětného volání, nebo

  • Použijte více objektů událostí a každý z nich vyšlete.

  • Pro nezávislé spouštění úloh použijte samostatná vlákna.

Chcete-li vytvořit a poté použít událost, postupujte podle těchto kroků v tomto pořadí:

  1. Vytvořte událost s event.

  2. Nastaví zpětné volání události s použitím názvu události (např.: myEvent(myCallback);).

  3. Broadcast an event:

    • broadcast — Spouští všechny registrované funkce v objektu události tak, aby běžely paralelně.

    • broadcastAndWait — Spustí všechny registrované funkce v objektu události a před pokračováním čeká na jejich dokončení.

Konstruktory tříd#

1 — Vytvoří objekt události event bez funkce zpětného volání.

event();

2 — Vytvoří objekt události event s funkcí zpětného volání.

event( void (* callback)(void) );

3 — Vytvoří objekt události event z jiné události pomocí funkce zpětného volání.

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

4 — Vytvoří objekt události event s funkcí zpětného volání, která přijímá argument.

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

5 — Vytvoří objekt události event z jiné události pomocí funkce zpětného volání, která přijímá argument.

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

Destruktor tříd#

Zničí objekt události event a uvolní přidružené prostředky.

~event();

Parametry#

Parametr

Typ

Popis

callback

void (*)(void)

Funkce, která je předem definována k provedení při vysílání události.

v

event

Existující objekt události, ze kterého se má kopírovat.

callback

void (*)(void *)

Funkce, která přijímá argument typu void pointer a provede se při vysílání události.

arg

void *

Ukazatel na data, která budou předána zpětné funkci.

Poznámky#

  • Objekt event ukládá jedno zpětné volání. Pokud zaregistrujete jinou funkci se stejným objektem události, tato funkce nahradí předchozí zpětné volání.

  • Pokud chcete, aby se z jednoho spouštěče dělo více věcí, buď:

    • Volání více pomocných funkcí z jednoho zpětného volání, nebo

    • Použijte více objektů událostí a každý z nich vyšlete.

    • Pro nezávislé spouštění úloh používejte samostatná vlákna.

Příklad#

Definujte callback funkci (mimo int main())

// Create a callback function
void onMyEvent() {
  Brain.Screen.print("Callback function executed!");
}

Zaregistrujte zpětné volání uvnitř 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);
}

Členské funkce#

Třída event obsahuje následující členské funkce:

  • operator — Nastaví funkci zpětného volání pro událost.

  • broadcast — Spouští paralelní spuštění callback funkce události.

  • broadcastAndWait — Spustí funkci zpětného volání události a čeká na dokončení.

Před voláním jakékoli členské funkce event je nutné vytvořit instanci event , jak je znázorněno níže:

/* 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#

Nastaví funkci zpětného volání pro událost pomocí operátoru volání funkce.

Available Functions
void operator()( void (* callback)() );

Parameters

Parametr

Typ

Popis

callback

void (*)(void)

Předem definovaná funkce zpětného volání, která se volá automaticky při vysílání události. Funkce musí odpovídat požadované signatuře zpětného volání. Další informace naleznete v části Funkce zpětného volání.

Return Values

Tato funkce nevrací hodnotu.

Notes
  • Opětovné nastavení zpětného volání nahradí předchozí zpětné volání.

  • Funkce zpětného volání nesmí mít žádné parametry a vracet hodnotu void.

Examples

Definujte callback funkce (mimo 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);
}

Zaregistrujte zpětné volání uvnitř 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 spustí zpětné volání události a okamžitě pokračuje.

Member Functions
void broadcast();

Parameters

Tato funkce nepřijímá žádné parametry.

Return Values

Tato funkce nevrací hodnotu.

Examples

Definujte callback funkci (mimo int main())

// Create a callback function
void onMyEvent() {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Event fired!");
}

Zaregistrujte zpětné volání uvnitř 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#

Spustí zpětné volání a čeká na jeho dokončení (nebo na vypršení časového limitu).

Available Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Parametr

Typ

Popis

timeout

int32_t

Počet milisekund, které se mají čekat, než se kód znovu začne provádět (výchozí hodnota je 60000).

Return Values

Tato funkce nevrací hodnotu.

Notes
  • Používejte toto pouze s voláními, která končí (žádné nekonečné smyčky).

  • Toto je čekající funkce, která blokuje provádění, dokud se zpětné volání nedokončí nebo nevyprší časový limit.

Examples

Definujte callback funkci (mimo int main())

// Create a callback function
void startDriving() {
  Drivetrain.drive(forward);
  wait(2, seconds);
}

Zaregistrujte zpětné volání uvnitř 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!");
}