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:

  1. Sukurkite įvykį naudodami event.

  2. Nustatykite įvykio atgalinį iškvietimą naudodami įvykio pavadinimą (pvz.: myEvent(myCallback);).

  3. 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 event objektą be grįžtamosios iškvietimo funkcijos.

event();

2 — Sukuria event objektą su grįžtamosios iškvietimo funkcija.

event( void (* callback)(void) );

3 — Sukuria event objektą iš kito įvykio su grįžtamosios iškvietimo funkcija.

event( 
  event v, 
  void (* callback)(void) );

4 — Sukuria event objektą su grįžtamosios iškvietimo funkcija, kuri priima argumentą.

event( void (* callback)(void *), void *arg );

5 — Sukuria event objektą 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

callback

void (*)(void)

Funkcija, kuri anksčiau buvo apibrėžta vykdyti, kai įvykis transliuojamas.

v

event

Esamas įvykio objektas, iš kurio galima kopijuoti.

callback

void (*)(void *)

Funkcija, kuri priima tuščio rodyklės argumentą ir vykdoma, kai įvykis transliuojamas.

arg

void *

Rodyklė į duomenis, kurie bus perduoti atgalinio iškvietimo funkcijai.

Pastabos#

  • 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ų.

    • 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() viduje

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);
}

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 Functions
void operator()( void (* callback)() );

Parameters

Parametras

Tipas

Aprašymas

callback

void (*)(void)

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.

Return Values

Ši funkcija negrąžina reikšmės.

Notes
  • Nustačius atgalinį iškvietimą dar kartą, ankstesnis atgalinis iškvietimas pakeičiamas.

  • Atgalinio iškvietimo funkcija negali turėti parametrų ir grąžinti void.

Examples

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() viduje

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 pradeda įvykio atgalinį iškvietimą ir iš karto tęsia.

Member Functions
void broadcast();

Parameters

Ši funkcija nepriima jokių parametrų.

Return Values

Ši funkcija negrąžina reikšmės.

Examples

Apibrėž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() viduje

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#

Pradeda grįžtamąjį ryšį ir laukia, kol jis baigsis (arba pasibaigs skirtasis laikas).

Available Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Parametras

Tipas

Aprašymas

timeout

int32_t

Milisekundžių skaičius, kurį reikia palaukti, kol kodas vėl bus pradėtas vykdyti (numatytoji reikšmė yra 60000).

Return Values

Ši funkcija negrąžina reikšmės.

Notes
  • Naudokite 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.

Examples

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() viduje

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