Dans un programme, certaines choses se produisent de façon imprévisible — une réponse arrive, une condition est atteinte, une erreur survient. Plutôt que de scruter en permanence l’état du programme avec des boucles de polling, il est bien plus élégant de réagir à ces moments. C’est le rôle des événements dans MOGWAI.
Le principe
Le modèle d’événements de MOGWAI est simple : on déclare un gestionnaire qui sera exécuté quand un événement précis se produit, et n’importe quelle partie du programme peut déclencher cet événement à tout moment.
Comme les timers, le code d’un événement s’exécute sur sa propre stack, isolée de celle du programme principal. Il a en revanche accès aux variables globales du programme.
Déclarer un événement
Pour répondre à un événement, on utilise onEvent suivi du nom de l’événement et du bloc de code à exécuter :
onEvent 'MON_EVENEMENT' do
{
"L'événement s'est déclenché !" ?
}
Le code du gestionnaire dispose automatiquement d’une variable locale eventData, qui porte le paramètre transmis lors du déclenchement. Si aucun paramètre n’est fourni, eventData vaut null.
onEvent 'MON_EVENEMENT' do
{
"Reçu : {! eventData}" eval ?
}
Déclencher un événement
C’est la fonction event.fire qui déclenche un événement. Elle prend deux paramètres : le nom de l’événement et la valeur associée.
# Déclencher sans paramètre
'MON_EVENEMENT' null event.fire
# Déclencher avec un paramètre
'MON_EVENEMENT' "Bonjour !" event.fire
Gérer le cycle de vie des événements
MOGWAI propose deux fonctions utilitaires :
event.list— retourne la liste des événements déclarés'nom' event.purge— supprime un gestionnaire d’événement
Suspendre les événements : DI et EI
Comme pour les timers, il est possible de bloquer temporairement le déclenchement des événements avec DI (Disable Interrupts) et EI (Enable Interrupts).
Le comportement est identique : les événements ne sont pas perdus, ils sont mis en file d’attente et s’exécutent tous dès que EI est appelé.
DI
# Aucun événement ne se déclenchera ici
# ... section critique ...
EI
# Les événements en attente s'exécutent maintenant
Pour en savoir plus sur DI et EI, consultez l’article sur les timers.
Et l’application hôte ?
Un programme MOGWAI s’exécute toujours au sein d’une application hôte — MOGWAI CLI, MOGWAI Studio, ou votre propre application. Cette application peut elle aussi déclencher des événements dans le code MOGWAI, et inversement, MOGWAI peut générer des événements à destination de l’hôte. C’est un canal de communication bidirectionnel puissant, qui fera l’objet d’un article dédié.
Exemple complet
Voici un petit système de log basé sur les événements. Trois événements correspondent à trois niveaux de sévérité : LOG_INFO, LOG_WARNING et LOG_ERROR. Chacun affiche le message reçu avec un préfixe distinct.
mogwai.reset
# Gestionnaires de log
onEvent 'LOG_INFO' do
{
"[INFO] {! eventData}" eval ?
}
onEvent 'LOG_WARNING' do
{
"[WARNING] {! eventData}" eval ?
}
onEvent 'LOG_ERROR' do
{
"[ERROR] {! eventData}" eval ?
}
# On déclenche quelques événements pour tester
'LOG_INFO' "Démarrage du programme" event.fire
'LOG_INFO' "Connexion établie" event.fire
'LOG_WARNING' "Délai de réponse élevé" event.fire
'LOG_ERROR' "Timeout de connexion" event.fire
'LOG_INFO' "Reconnexion en cours..." event.fire
forever do { }
La sortie console sera :
[INFO] Démarrage du programme
[INFO] Connexion établie
[WARNING] Délai de réponse élevé
[ERROR] Timeout de connexion
[INFO] Reconnexion en cours...
Ce modèle est très souple : il suffit d’enrichir les gestionnaires pour, par exemple, horodater les messages ou les écrire dans un fichier.
Événements et Tasks
Les événements jouent également un rôle central dans la communication entre les tâches parallèles de MOGWAI. Quand une Task enfant publie un résultat ou se termine, c’est via des événements que la Task parente en est informée. Ce sujet sera couvert dans l’article dédié aux Tasks.
MOGWAI — open source depuis février 2026 · GitHub · coding4phone.com
1 réflexion au sujet de « Les événements dans MOGWAI »