É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 :
Créez l’événement avec
event.Définir le rappel de l’événement en utilisant le nom de l’événement (ex :
myEvent(myCallback);).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
eventsans fonction de rappel.event();
2 — Crée un objet événement
eventavec 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
eventavec 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 |
|---|---|---|
|
|
Une fonction préalablement définie pour s’exécuter lorsque l’événement est diffusé. |
|
|
Un objet événement existant à copier. |
|
|
Une fonction qui accepte un argument de type pointeur void et qui s’exécute lorsque l’événement est diffusé. |
|
|
Un pointeur vers les données qui seront transmises à la fonction de rappel. |
Notes#
Un objet
eventstocke 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 Functionsvoid operator()( void (* callback)() );
Paramètre |
Taper |
Description |
|---|---|---|
|
|
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. |
Cette fonction ne renvoie aucune valeur.
NotesDé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.
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.
void broadcast();
Cette fonction ne prend aucun paramètre.
Return ValuesCette fonction ne renvoie aucune valeur.
ExamplesDé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 Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Paramètre |
Taper |
Description |
|---|---|---|
|
|
Le nombre de millisecondes à attendre avant que le code ne recommence à s’exécuter (par défaut : 60 000). |
Cette fonction ne renvoie aucune valeur.
NotesUtilisez 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.
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!"); }