Evenementen#

Invoering#

Met behulp van events kun je een functie asynchroon starten. Wanneer een event wordt uitgezonden, wordt de callback-functie van het event in een eigen taak (thread) gestart, zodat je hoofdcode tegelijkertijd kan blijven draaien.

Belangrijk: Een event-object met event waarden slaat één callbackfunctie op. Als u een andere functie registreert met hetzelfde event-object, vervangt deze de vorige callbackfunctie.

Als je wilt dat er meerdere dingen gebeuren als gevolg van één trigger, dan kun je het volgende doen:

  • Roep meerdere hulpfuncties aan vanuit één callback, of

  • Gebruik meerdere gebeurtenisobjecten en zend ze allemaal uit.

  • Gebruik aparte threads om taken onafhankelijk van elkaar uit te voeren.

Om een ​​evenement aan te maken en te gebruiken, volg je deze stappen in de juiste volgorde:

  1. Maak het evenement aan met event.

  2. Stel de callback van de gebeurtenis in met behulp van de gebeurtenisnaam (bijv.: myEvent(myCallback);).

  3. Broadcast an event:

    • broadcast — Activeert alle geregistreerde functies in een gebeurtenisobject om parallel te worden uitgevoerd.

    • broadcastAndWait — Activeert alle geregistreerde functies in een gebeurtenisobject en wacht tot ze klaar zijn voordat verder wordt gegaan.

Klasseconstructors#

1 — Maakt een event object aan zonder callback-functie.

event();

2 — Maakt een event object aan met een callbackfunctie.

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

3 — Maakt een event object aan op basis van een ander event met een callback-functie.

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

4 — Maakt een event object aan met een callbackfunctie die een argument accepteert.

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

5 — Maakt een event object aan op basis van een ander event met een callbackfunctie die een argument accepteert.

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

Klasse-destructor#

Vernietigt het event object en geeft de bijbehorende resources vrij.

~event();

Parameters#

Parameter

Type

Beschrijving

callback

void (*)(void)

Een functie die vooraf is gedefinieerd en die wordt uitgevoerd wanneer de gebeurtenis wordt uitgezonden.

v

event

Een bestaand gebeurtenisobject om van te kopiëren.

callback

void (*)(void *)

Een functie die een void-pointerargument accepteert en wordt uitgevoerd wanneer de gebeurtenis wordt uitgezonden.

arg

void *

Een verwijzing naar de gegevens die aan de callbackfunctie worden doorgegeven.

Notities#

  • Een event-object ( event ) slaat één callbackfunctie op. Als je een andere functie registreert met hetzelfde event-object, vervangt deze de vorige callbackfunctie.

  • Als je wilt dat er meerdere dingen gebeuren als gevolg van één trigger, dan kun je het volgende doen:

    • Roep meerdere hulpfuncties aan vanuit één callback, of

    • Gebruik meerdere gebeurtenisobjecten en zend ze allemaal uit.

    • Gebruik aparte threads om taken onafhankelijk van elkaar uit te voeren.

Voorbeeld#

Definieer de callbackfunctie (buiten int main())

// Create a callback function
void onMyEvent() {
  Brain.Screen.print("Callback function executed!");
}

Registreer de callback binnen 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);
}

Lidfuncties#

De klasse event bevat de volgende lidfuncties:

  • operator — Stelt een callbackfunctie in voor de gebeurtenis.

  • broadcast — Activeert de callbackfunctie van de gebeurtenis om parallel te worden uitgevoerd.

  • broadcastAndWait — Activeert de callbackfunctie van de gebeurtenis en wacht op voltooiing.

Voordat er lidfuncties van gebeurtenis event kunnen worden aangeroepen, moet er een instantie van gebeurtenis event worden aangemaakt, zoals hieronder wordt weergegeven:

/* 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#

Stelt een callbackfunctie in voor de gebeurtenis met behulp van de functieaanroepoperator.

Available Functions
void operator()( void (* callback)() );

Parameters

Parameter

Type

Beschrijving

callback

void (*)(void)

Een eerder gedefinieerde callbackfunctie die automatisch wordt aangeroepen wanneer de gebeurtenis wordt uitgezonden. De functie moet overeenkomen met de vereiste callbacksignatuur. Zie Callbackfuncties voor meer informatie.

Return Values

Deze functie retourneert geen waarde.

Notes
  • Het opnieuw instellen van een callback vervangt de vorige callback.

  • De callbackfunctie mag geen parameters hebben en moet void retourneren.

Examples

Definieer de callbackfuncties (buiten 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);
}

Registreer de callback binnen 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 start de callback van het evenement en gaat direct verder.

Member Functions
void broadcast();

Parameters

Deze functie accepteert geen parameters.

Return Values

Deze functie retourneert geen waarde.

Examples

Definieer de callbackfunctie (buiten int main())

// Create a callback function
void onMyEvent() {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Event fired!");
}

Registreer de callback binnen 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#

Start de callback en wacht tot deze is voltooid (of tot de time-out is bereikt).

Available Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Parameter

Type

Beschrijving

timeout

int32_t

Het aantal milliseconden dat gewacht moet worden voordat de code opnieuw wordt uitgevoerd (standaardwaarde: 60000).

Return Values

Deze functie retourneert geen waarde.

Notes
  • Gebruik dit alleen met callbacks die eindigen (geen oneindige lussen).

  • Dit is een wachtfunctie die de uitvoering blokkeert totdat de callback is voltooid of de time-out is bereikt.

Examples

Definieer de callbackfunctie (buiten int main())

// Create a callback function
void startDriving() {
  Drivetrain.drive(forward);
  wait(2, seconds);
}

Registreer de callback binnen 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!");
}