Renginiai#
Įvadas#
Įvykiai leidžia paleisti funkciją asinchroniškai. Kai įvykis transliuojamas, įvykio atgalinio iškvietimo funkcija paleidžiama atskiroje užduotyje (gijoje), todėl pagrindinis kodas gali toliau veikti tuo pačiu metu.
Svarbu: event objektas saugo vieną grįžtamąjį iškvietimą. Jei užregistruosite kitą funkciją su tuo pačiu įvykio objektu, ji pakeis ankstesnį grįžtamąjį iškvietimą.
Jei norite, kad iš vieno trigerio įvyktų keli dalykai, atlikite vieną iš šių veiksmų:
Iškviesti kelias pagalbines funkcijas iš vieno atgalinio iškvietimo arba
Naudokite kelis įvykių objektus ir transliuokite kiekvieną iš jų.
Norėdami vykdyti užduotis nepriklausomai, naudokite atskirus threads.
Norėdami sukurti ir naudoti įvykį, atlikite šiuos veiksmus tokia tvarka:
Sukurkite įvykį naudodami
event.Nustatykite įvykio atgalinį iškvietimą naudodami įvykio pavadinimą (pvz.:
myEvent(myCallback);).Broadcast an
event:broadcast— Suaktyvina visas įvykio objekte užregistruotas funkcijas, kad jos veiktų lygiagrečiai.broadcastAndWait– Suaktyvina visas užregistruotas įvykio objekto funkcijas ir palaukia, kol jos bus baigtos, prieš tęsiant.
Klasės konstruktoriai#
1 — Sukuria
eventobjektą be grįžtamosios iškvietimo funkcijos.event();
2 — Sukuria
eventobjektą su grįžtamosios iškvietimo funkcija.event( void (* callback)(void) );
3 — Sukuria
eventobjektą iš kito įvykio su grįžtamosios iškvietimo funkcija.event( event v, void (* callback)(void) );
4 — Sukuria
eventobjektą su grįžtamosios iškvietimo funkcija, kuri priima argumentą.event( void (* callback)(void *), void *arg );
5 — Sukuria
eventobjektą iš kito įvykio su grįžtamosios iškvietimo funkcija, kuri priima argumentą.event( event v, void (* callback)(void *), void *arg );
Klasės destruktorius#
Sunaikina event objektą ir išlaisvina susijusius išteklius.
~event();
Parametrai#
Parametras |
Tipas |
Aprašymas |
|---|---|---|
|
|
Funkcija, kuri anksčiau buvo apibrėžta vykdyti, kai įvykis transliuojamas. |
|
|
Esamas įvykio objektas, iš kurio galima kopijuoti. |
|
|
Funkcija, kuri priima tuščio rodyklės argumentą ir vykdoma, kai įvykis transliuojamas. |
|
|
Rodyklė į duomenis, kurie bus perduoti atgalinio iškvietimo funkcijai. |
Pastabos#
eventobjektas saugo vieną grįžtamąjį iškvietimą. Jei užregistruosite kitą funkciją su tuo pačiu įvykio objektu, ji pakeis ankstesnį grįžtamąjį iškvietimą.Jei norite, kad iš vieno trigerio įvyktų keli dalykai, atlikite vieną iš šių veiksmų:
Iškviesti kelias pagalbines funkcijas iš vieno atgalinio iškvietimo arba
Naudokite kelis įvykių objektus ir transliuokite kiekvieną iš jų.
Naudokite atskiras gijas, kad užduotys būtų vykdomos nepriklausomai.
Pavyzdys#
Apibrėžkite grįžtamojo ryšio funkciją (už
int main())// Create a callback function void onMyEvent() { Brain.Screen.print("Callback function executed!"); }Registruokite atgalinį iškvietimą
int main()vidujeint 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); }
Narių funkcijos#
event klasė apima šias narines funkcijas:
operator— Nustato įvykio atgalinio iškvietimo funkciją.broadcast— Suaktyvina įvykio atgalinio iškvietimo funkciją, kad ji veiktų lygiagrečiai.broadcastAndWait— Suaktyvina įvykio atgalinio iškvietimo funkciją ir laukia, kol bus baigta.
Prieš iškviečiant bet kokias event narių funkcijas, reikia sukurti event egzempliorių, kaip parodyta žemiau:
/* 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#
Nustato įvykio atgalinio iškvietimo funkciją naudodamas funkcijos iškvietimo operatorių.
Available Functionsvoid operator()( void (* callback)() );
Parametras |
Tipas |
Aprašymas |
|---|---|---|
|
|
Anksčiau apibrėžta atgalinio iškvietimo funkcija, kuri iškviečiama automatiškai, kai įvykis transliuojamas. Funkcija turi atitikti reikiamą atgalinio iškvietimo parašą. Daugiau informacijos žr. Atgalinio iškvietimo funkcijos. |
Ši funkcija negrąžina reikšmės.
NotesNustačius atgalinį iškvietimą dar kartą, ankstesnis atgalinis iškvietimas pakeičiamas.
Atgalinio iškvietimo funkcija negali turėti parametrų ir grąžinti void.
Apibrėžkite grįžtamojo ryšio funkcijas (už
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); }Registruokite atgalinį iškvietimą
int main()vidujeint 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 pradeda įvykio atgalinį iškvietimą ir iš karto tęsia.
void broadcast();
Ši funkcija nepriima jokių parametrų.
Return ValuesŠi funkcija negrąžina reikšmės.
ExamplesApibrėžkite grįžtamojo ryšio funkciją (už
int main())// Create a callback function void onMyEvent() { Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Event fired!"); }Registruokite atgalinį iškvietimą
int main()vidujeint 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#
Pradeda grįžtamąjį ryšį ir laukia, kol jis baigsis (arba pasibaigs skirtasis laikas).
Available Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Parametras |
Tipas |
Aprašymas |
|---|---|---|
|
|
Milisekundžių skaičius, kurį reikia palaukti, kol kodas vėl bus pradėtas vykdyti (numatytoji reikšmė yra 60000). |
Ši funkcija negrąžina reikšmės.
NotesNaudokite tai tik su grįžtamaisiais iškvietimais, kurie baigiasi (be begalinių ciklų).
Tai laukimo funkcija, kuri blokuoja vykdymą, kol grįžtamasis iškvietimas bus baigtas arba pasibaigs skirtasis laikas.
Apibrėžkite grįžtamojo ryšio funkciją (už
int main())// Create a callback function void startDriving() { Drivetrain.drive(forward); wait(2, seconds); }Registruokite atgalinį iškvietimą
int main()vidujeint 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!"); }