Événements#

Introduction#

Les événements permettent de démarrer une fonction de manière asynchrone. Lorsqu’un événement est diffusé, sa fonction de rappel est lancée dans une tâche (thread) dédiée, ce qui permet à votre code principal de continuer à s’exécuter simultanément.

Important : Un objet event stocke une fonction de rappel. Si vous enregistrez une autre fonction avec le même objet événement, elle remplace la fonction de rappel précédente.

Si vous souhaitez que plusieurs actions se produisent à partir d’un seul déclencheur, vous pouvez soit :

  • Appeler plusieurs fonctions auxiliaires à partir d’une seule fonction de rappel, ou

  • Utilisez plusieurs objets d’événement et diffusez-les tous.

  • Utilisez des threads séparés pour exécuter les tâches indépendamment.

Pour créer puis utiliser un événement, suivez ces étapes dans l’ordre :

  1. Créez l’événement avec event.

  2. Définir le rappel de l’événement en utilisant le nom de l’événement (ex : myEvent(myCallback);).

  3. Broadcast an event:

    • broadcast — Déclenche l’exécution en parallèle de toutes les fonctions enregistrées dans un objet événement.

    • broadcastAndWait — Déclenche toutes les fonctions enregistrées dans un objet événement et attend qu’elles se terminent avant de continuer.

Constructeurs de classes#

1 — Crée un objet event sans fonction de rappel.

event();

2 — Crée un objet événement event avec une fonction de rappel.

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

3 — Crée un objet événement event à partir d’un autre événement avec une fonction de rappel.

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

4 — Crée un objet event avec une fonction de rappel qui accepte un argument.

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

5 — Crée un objet événement event à partir d’un autre événement avec une fonction de rappel qui accepte un argument.

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

Destructeur de classe#

Détruit l’objet de l’événement event et libère les ressources associées.

~event();

Paramètres#

Paramètre

Taper

Description

callback

void (*)(void)

Une fonction préalablement définie pour s’exécuter lorsque l’événement est diffusé.

v

event

Un objet événement existant à copier.

callback

void (*)(void *)

Une fonction qui accepte un argument de type pointeur void et qui s’exécute lorsque l’événement est diffusé.

arg

void *

Un pointeur vers les données qui seront transmises à la fonction de rappel.

Notes#

  • Un objet event stocke une fonction de rappel. Si vous enregistrez une autre fonction avec le même objet événement, elle remplace la fonction de rappel précédente.

  • Si vous souhaitez que plusieurs actions se produisent à partir d’un seul déclencheur, vous pouvez soit :

    • Appeler plusieurs fonctions auxiliaires à partir d’une seule fonction de rappel, ou

    • Utilisez plusieurs objets d’événement et diffusez-les tous.

    • Utilisez des threads séparés pour exécuter les tâches indépendamment.

Exemple#

Définissez la fonction de rappel (en dehors de int main())

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

Enregistrez le rappel à l’intérieur de 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);
}

Fonctions des membres#

La classe event comprend les fonctions membres suivantes :

  • operator — Définit une fonction de rappel pour l’événement.

  • broadcast — Déclenche l’exécution en parallèle de la fonction de rappel de l’événement.

  • broadcastAndWait — Déclenche la fonction de rappel de l’événement et attend la fin.

Avant d’appeler les fonctions membres de l’événement event , une instance de l’événement event doit être créée, comme indiqué ci-dessous :

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

Définit une fonction de rappel pour l’événement à l’aide de l’opérateur d’appel de fonction.

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

Parameters

Paramètre

Taper

Description

callback

void (*)(void)

Une fonction de rappel prédéfinie, appelée automatiquement lors de la diffusion de l’événement. Cette fonction doit respecter la signature de rappel requise. Consultez la section Fonctions de rappel pour plus d’informations.

Return Values

Cette fonction ne renvoie aucune valeur.

Notes
  • Définir à nouveau une fonction de rappel remplace la fonction de rappel précédente.

  • La fonction de rappel ne doit avoir aucun paramètre et ne doit rien renvoyer.

Examples

Définissez les fonctions de rappel (en dehors de 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);
}

Enregistrez le rappel à l’intérieur de 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#

La diffusion broadcast lance le rappel de l’événement et se poursuit immédiatement.

Member Functions
void broadcast();

Parameters

Cette fonction ne prend aucun paramètre.

Return Values

Cette fonction ne renvoie aucune valeur.

Examples

Définissez la fonction de rappel (en dehors de int main())

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

Enregistrez le rappel à l’intérieur de 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#

Démarre le rappel et attend qu’il se termine (ou qu’il expire).

Available Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Paramètre

Taper

Description

timeout

int32_t

Le nombre de millisecondes à attendre avant que le code ne recommence à s’exécuter (par défaut : 60 000).

Return Values

Cette fonction ne renvoie aucune valeur.

Notes
  • Utilisez ceci uniquement avec des fonctions de rappel qui se terminent (pas de boucles infinies).

  • Il s’agit d’une fonction d’attente qui bloque l’exécution jusqu’à ce que le rappel soit terminé ou expire.

Examples

Définissez la fonction de rappel (en dehors de int main())

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

Enregistrez le rappel à l’intérieur de 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!");
}