Pasākumi#
Ievads#
Notikumi ļauj asinhroni palaist funkciju. Kad notikums tiek pārraidīts, notikuma atzvanīšanas funkcija tiek palaista atsevišķā uzdevumā (pavedienā), lai jūsu galvenais kods varētu turpināt darboties vienlaikus.
Important: An event object stores one callback. If you register another function with the same event object, it replaces the previous callback.
Ja vēlaties, lai no viena aktivizētāja notiktu vairākas lietas, veiciet vienu no šīm darbībām:
Izsaukt vairākas palīgfunkcijas no viena atzvanīšanas signāla vai
Izmantojiet vairākus notikumu objektus un pārraidiet katru no tiem.
Lai uzdevumus palaistu neatkarīgi, izmantojiet atsevišķus pavedienus.
Lai izveidotu un pēc tam izmantotu notikumu, veiciet tālāk norādītās darbības norādītajā secībā:
Izveidojiet notikumu ar
event.Iestatīt notikuma atzvanīšanas signālu, izmantojot notikuma nosaukumu (piemēram,
myEvent(myCallback);).Broadcast an
event:broadcast— Ieslēdz visas reģistrētās funkcijas notikuma objektā, lai tās darbotos paralēli.broadcastAndWait— Iedarbina visas reģistrētās funkcijas notikuma objektā un gaida, līdz tās ir pabeigtas, pirms turpināt.
Klases konstruktori#
1 — Izveido
eventobjektu bez atzvanīšanas funkcijas.event();
2 — Izveido
eventobjektu ar atzvanīšanas funkciju.event( void (* callback)(void) );
3 — Izveido
eventobjektu no cita notikuma ar atzvanīšanas funkciju.event( event v, void (* callback)(void) );
4 — Izveido
eventobjektu ar atzvanīšanas funkciju, kas pieņem argumentu.event( void (* callback)(void *), void *arg );
5 — Izveido
eventobjektu no cita notikuma ar atzvanīšanas funkciju, kas pieņem argumentu.event( event v, void (* callback)(void *), void *arg );
Klases iznīcinātājs#
Iznīcina event objektu un atbrīvo saistītos resursus.
~event();
Parametri#
Parametrs |
Tips |
Apraksts |
|---|---|---|
|
|
Funkcija, kas iepriekš definēta izpildei, kad notikums tiek pārraidīts. |
|
|
Esošs notikuma objekts, no kura kopēt. |
|
|
Funkcija, kas pieņem tukša rādītāja argumentu un tiek izpildīta, kad notikums tiek pārraidīts. |
|
|
Rādītājs uz datiem, kas tiks nodoti atzvanīšanas funkcijai. |
Piezīmes#
eventobjekts saglabā vienu atzvanīšanas pieprasījumu. Ja reģistrējat citu funkciju ar to pašu notikuma objektu, tā aizstāj iepriekšējo atzvanīšanas pieprasījumu.Ja vēlaties, lai no viena aktivizētāja notiktu vairākas lietas, veiciet vienu no šīm darbībām:
Izsaukt vairākas palīgfunkcijas no viena atzvanīšanas signāla vai
Izmantojiet vairākus notikumu objektus un pārraidiet katru no tiem.
Izmantojiet atsevišķus pavedienus, lai uzdevumus izpildītu neatkarīgi.
Piemērs#
// 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);
}
Dalībnieku funkcijas#
event klasē ir iekļautas šādas dalībfunkcijas:
operator— Iestata notikuma atzvanīšanas funkciju.broadcast— Aktivizē notikuma atzvanīšanas funkcijas paralēlu darbību.broadcastAndWait— Aktivizē notikuma atzvanīšanas funkciju un gaida pabeigšanu.
Pirms jebkuru event dalībfunkciju izsaukšanas ir jāizveido event instance, kā parādīts zemāk:
/* 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#
Iestata notikuma atzvanīšanas funkciju, izmantojot funkcijas izsaukšanas operatoru.
Available Functionsvoid operator()( void (* callback)() );
Parametrs |
Tips |
Apraksts |
|---|---|---|
|
|
Iepriekš definēta atzvanīšanas funkcija, kas tiek izsaukta automātiski, kad notikums tiek pārraidīts. Funkcijai ir jāatbilst nepieciešamajam atzvanīšanas parakstam. Plašāku informāciju skatiet sadaļā Atzvanīšanas funkcijas. |
Šī funkcija neatgriež vērtību.
NotesAtzvanīšanas iestatīšana vēlreiz aizstāj iepriekšējo atzvanīšanu.
Atzvanīšanas funkcijai nedrīkst būt parametru, un tai jāatgriež tukšums (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 sāk notikuma atzvanīšanu un nekavējoties turpinās.
void broadcast();
Šī funkcija nepieņem nekādus parametrus.
Return ValuesŠī funkcija neatgriež vērtību.
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#
Sāk atzvanu un gaida, līdz tas beidzas (vai iestājas taimauts).
Available Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Parametrs |
Tips |
Apraksts |
|---|---|---|
|
|
Milisekundes, kas jāgaida, pirms kods atkal sāk izpildīties (pēc noklusējuma ir 60000). |
Šī funkcija neatgriež vērtību.
NotesIzmantojiet to tikai ar atzvanīšanas darbībām, kas beidzas (nevis bezgalīgiem cikliem).
Šī ir gaidīšanas funkcija, kas bloķē izpildi, līdz atzvanīšana ir pabeigta vai iestājas taimauts.
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!");
}