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