Tapahtumat#
Johdanto#
Tapahtumien avulla voit käynnistää funktion asynkronisesti. Kun tapahtuma lähetetään, tapahtuman takaisinkutsufunktio käynnistetään omassa tehtävässään (säikeessään), joten pääkoodisi voi jatkaa suoritusta samanaikaisesti.
Tärkeää: Tapahtuma event tallentaa yhden takaisinkutsun. Jos rekisteröit toisen funktion samalla tapahtumaobjektilla, se korvaa edellisen takaisinkutsun.
Jos haluat useiden asioiden tapahtuvan yhdestä liipaisimesta, joko:
Kutsu useita apufunktioita yhdestä takaisinkutsusta tai
Käytä useita tapahtumaobjekteja ja lähetä jokainen niistä.
Käytä erillisiä threads-säikeitä tehtävien suorittamiseen itsenäisesti.
Voit luoda ja käyttää tapahtumaa noudattamalla seuraavia ohjeita annetussa järjestyksessä:
Luo tapahtuma käyttämällä
event.Aseta tapahtuman takaisinkutsu käyttämällä tapahtuman nimeä (esim.:
myEvent(myCallback);).Broadcast an
event:broadcast— Käynnistää kaikki tapahtumaobjektin rekisteröidyt funktiot rinnakkain.broadcastAndWait— Käynnistää kaikki tapahtumaobjektin rekisteröidyt funktiot ja odottaa niiden päättymistä ennen jatkamista.
Luokanrakentajat#
1 — Luo
event-objektin ilman takaisinkutsufunktiota.event();
2 — Luo
event-objektin, jossa on takaisinkutsufunktio.event( void (* callback)(void) );
3 — Luo
event-objektin toisesta tapahtumasta callback-funktiolla.event( event v, void (* callback)(void) );
4 — Luo
event-objektin, jossa on argumentin hyväksyvä takaisinkutsufunktio.event( void (* callback)(void *), void *arg );
5 — Luo
event-objektin toisesta tapahtumasta, jossa on argumentin hyväksyvä takaisinkutsufunktio.event( event v, void (* callback)(void *), void *arg );
Luokan tuhoaja#
Tuhoaa event objektin ja vapauttaa siihen liittyvät resurssit.
~event();
Parametrit#
Parametri |
Tyyppi |
Kuvaus |
|---|---|---|
|
|
Funktio, joka on aiemmin määritelty suoritettavaksi, kun tapahtuma lähetetään. |
|
|
Olemassa oleva tapahtumaobjekti, josta kopioidaan. |
|
|
Funktio, joka hyväksyy tyhjän osoittimen argumentin ja suoritetaan, kun tapahtuma lähetetään. |
|
|
Osoitin tietoihin, jotka välitetään takaisinkutsufunktiolle. |
Muistiinpanoja#
event-objekti tallentaa yhden takaisinkutsun. Jos rekisteröit toisen funktion samalla tapahtumaobjektilla, se korvaa edellisen takaisinkutsun.Jos haluat useiden asioiden tapahtuvan yhdestä liipaisimesta, joko:
Kutsu useita apufunktioita yhdestä takaisinkutsusta tai
Käytä useita tapahtumaobjekteja ja lähetä jokainen niistä.
Käytä erillisiä säikeitä tehtävien suorittamiseen itsenäisesti.
Esimerkki#
Määrittele takaisinkutsufunktio (
int main())// Create a callback function void onMyEvent() { Brain.Screen.print("Callback function executed!"); }Rekisteröi takaisinkutsu
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); }
Jäsenten toiminnot#
event -luokka sisältää seuraavat jäsenfunktiot:
operator— Asettaa tapahtumalle takaisinkutsufunktion.broadcast— Käynnistää tapahtuman takaisinkutsufunktion rinnakkain.broadcastAndWait— Käynnistää tapahtuman takaisinkutsufunktion ja odottaa valmistumista.
Ennen minkään event -jäsenfunktion kutsumista on luotava event -instanssi alla olevan mukaisesti:
/* 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#
Asettaa tapahtumalle takaisinkutsufunktion käyttämällä funktion kutsuoperaattoria.
Available Functionsvoid operator()( void (* callback)() );
Parametri |
Tyyppi |
Kuvaus |
|---|---|---|
|
|
Aiemmin määritelty takaisinkutsufunktio, jota kutsutaan automaattisesti tapahtuman lähetyksen yhteydessä. Funktion on vastattava vaadittua takaisinkutsuallekirjoitusta. Lisätietoja on kohdassa Callback Functions. |
Tämä funktio ei palauta arvoa.
NotesTakaisinsoiton asettaminen uudelleen korvaa edellisen takaisinsoiton.
Takaisinkutsufunktiolla ei saa olla parametreja, ja sen tulee palauttaa tyhjä arvo.
Määrittele takaisinkutsufunktiot (muualla kuin
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); }Rekisteröi takaisinkutsu
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 aloittaa tapahtuman takaisinkutsutoiminnon ja jatkuu välittömästi.
void broadcast();
Tämä funktio ei ota vastaan parametreja.
Return ValuesTämä funktio ei palauta arvoa.
ExamplesMäärittele takaisinkutsufunktio (
int main())// Create a callback function void onMyEvent() { Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Event fired!"); }Rekisteröi takaisinkutsu
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#
Aloittaa takaisinsoiton ja odottaa sen päättymistä (tai aikakatkaisua).
Available Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Parametri |
Tyyppi |
Kuvaus |
|---|---|---|
|
|
Millisekuntien määrä, joka odotetaan ennen koodin suorittamisen jatkamista (oletusarvo on 60000). |
Tämä funktio ei palauta arvoa.
NotesKäytä tätä vain päättyvien takaisinkutsujen kanssa (ei loputtomiin silmukoihin).
Tämä on odotusfunktio, joka estää suorituksen, kunnes takaisinkutsu on valmis tai aikakatkaistu.
Määrittele takaisinkutsufunktio (
int main())// Create a callback function void startDriving() { Drivetrain.drive(forward); wait(2, seconds); }Rekisteröi takaisinkutsu
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!"); }