Händelser#

Introduktion#

Händelser låter dig starta en funktion asynkront. När en händelse sänds startas händelsens callback-funktion i sin egen uppgift (tråd), så att din huvudkod kan fortsätta köras samtidigt.

Viktigt: Ett event objekt lagrar ett callback. Om du registrerar en annan funktion med samma eventobjekt ersätter det föregående callback-et.

Om du vill att flera saker ska hända från en och samma trigger, antingen:

  • Anropa flera hjälpfunktioner från ett enda återanrop, eller

  • Använd flera händelseobjekt och sänd ut vart och ett.

  • Använd separata trådar för att köra uppgifter oberoende av varandra.

För att skapa och sedan använda en händelse, följ dessa steg i ordning:

  1. Skapa händelsen med event.

  2. Ställ in händelsens återanrop med hjälp av händelsenamnet (t.ex.: myEvent(myCallback);).

  3. Broadcast an event:

    • broadcast — Utlöser att alla registrerade funktioner i ett händelseobjekt körs parallellt.

    • broadcastAndWait — Utlöser alla registrerade funktioner i ett händelseobjekt och väntar på att de ska slutföras innan den fortsätter.

Klasskonstruktörer#

1 — Skapar ett event objekt utan en callback-funktion.

event();

2 — Skapar ett event objekt med en callback-funktion.

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

3 — Skapar ett event objekt från en annan händelse med en callback-funktion.

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

4 — Skapar ett event objekt med en callback-funktion som accepterar ett argument.

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

5 — Skapar ett event objekt från en annan händelse med en callback-funktion som accepterar ett argument.

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

Klassförstörare#

Förstör event objektet och frigör tillhörande resurser.

~event();

Parametrar#

Parameter

Typ

Beskrivning

callback

void (*)(void)

En funktion som tidigare har definierats att köras när händelsen sänds.

v

event

Ett befintligt händelseobjekt att kopiera från.

callback

void (*)(void *)

En funktion som accepterar ett void-pekarargument och körs när händelsen sänds.

arg

void *

En pekare till data som kommer att skickas till callback-funktionen.

Anteckningar#

  • Ett event objekt lagrar ett callback. Om du registrerar en annan funktion med samma eventobjekt ersätter det det föregående callback-et.

  • Om du vill att flera saker ska hända från en och samma trigger, antingen:

    • Anropa flera hjälpfunktioner från ett enda återanrop, eller

    • Använd flera händelseobjekt och sänd ut vart och ett.

    • Använd separata trådar för att köra uppgifter oberoende av varandra.

Exempel#

Definiera callback-funktionen (utanför int main())

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

Registrera återuppringningen inuti 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);
}

Medlemsfunktioner#

Klassen event innehåller följande medlemsfunktioner:

  • operator — Ställer in en återuppringningsfunktion för händelsen.

  • broadcast — Utlöser att händelsens återanropsfunktion körs parallellt.

  • broadcastAndWait — Utlöser händelsens återuppringningsfunktion och väntar på att den är klar.

Innan några event medlemsfunktioner anropas måste en event instans skapas, som visas nedan:

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

Ställer in en callback-funktion för händelsen med hjälp av funktionens anropsoperator.

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

Parameters

Parameter

Typ

Beskrivning

callback

void (*)(void)

En tidigare definierad återuppringningsfunktion som anropas automatiskt när händelsen sänds. Funktionen måste matcha den erforderliga återuppringningssignaturen. Se Återuppringningsfunktioner för mer information.

Return Values

Den här funktionen returnerar inget värde.

Notes
  • Att ställa in en återuppringning ersätter den föregående återuppringningen.

  • Återanropsfunktionen får inte ha några parametrar och returnera void.

Examples

Definiera callback-funktionerna (utanför 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);
}

Registrera återuppringningen inuti 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 startar händelsens återuppringning och fortsätter omedelbart.

Member Functions
void broadcast();

Parameters

Den här funktionen tar inga parametrar.

Return Values

Den här funktionen returnerar inget värde.

Examples

Definiera callback-funktionen (utanför int main())

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

Registrera återuppringningen inuti 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#

Startar återuppringningen och väntar tills den är klar (eller tidsgränsen överskrids).

Available Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Parameter

Typ

Beskrivning

timeout

int32_t

Antalet millisekunder som ska väntas innan koden börjar köras igen (standardvärdet är 60000).

Return Values

Den här funktionen returnerar inget värde.

Notes
  • Använd endast detta med återanrop som slutar (inga oändliga loopar).

  • Detta är en väntefunktion som blockerar körningen tills återanropet är klart eller tidsgränsen uppnås.

Examples

Definiera callback-funktionen (utanför int main())

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

Registrera återuppringningen inuti 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!");
}