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í:
Vytvořte událost s
event.Nastaví zpětné volání události s použitím názvu události (např.:
myEvent(myCallback);).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
eventbez funkce zpětného volání.event();
2 — Vytvoří objekt události
events funkcí zpětného volání.event( void (* callback)(void) );
3 — Vytvoří objekt události
eventz jiné události pomocí funkce zpětného volání.event( event v, void (* callback)(void) );
4 — Vytvoří objekt události
events funkcí zpětného volání, která přijímá argument.event( void (* callback)(void *), void *arg );
5 — Vytvoří objekt události
eventz 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 |
|---|---|---|
|
|
Funkce, která je předem definována k provedení při vysílání události. |
|
|
Existující objekt události, ze kterého se má kopírovat. |
|
|
Funkce, která přijímá argument typu void pointer a provede se při vysílání události. |
|
|
Ukazatel na data, která budou předána zpětné funkci. |
Poznámky#
Objekt
eventuklá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 Functionsvoid operator()( void (* callback)() );
Parametr |
Typ |
Popis |
|---|---|---|
|
|
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í. |
Tato funkce nevrací hodnotu.
NotesOpě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.
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.
void broadcast();
Tato funkce nepřijímá žádné parametry.
Return ValuesTato funkce nevrací hodnotu.
ExamplesDefinujte 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 Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Parametr |
Typ |
Popis |
|---|---|---|
|
|
Počet milisekund, které se mají čekat, než se kód znovu začne provádět (výchozí hodnota je 60000). |
Tato funkce nevrací hodnotu.
NotesPouží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.
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!"); }