Dans un programme, il est souvent nécessaire d’exécuter du code à un moment précis dans le futur, ou de façon répétée à intervalles réguliers — sans pour autant bloquer le reste du programme. C’est exactement le rôle des timers dans MOGWAI.
Une stack isolée
Avant d’entrer dans le vif du sujet, il y a un point de design important à comprendre : le code d’un timer s’exécute sur sa propre stack, séparée de celle du programme principal.
Cette isolation est intentionnelle. Comme un timer peut se déclencher à n’importe quel moment, il ne doit pas perturber l’état de la stack principale. En revanche, le code d’un timer a accès aux variables globales du programme en cours — c’est le mécanisme naturel pour communiquer des données entre le programme principal et ses timers.
Les deux types de timers
MOGWAI propose deux comportements distincts.
Un timer de type after se déclenche une seule fois, après un délai défini en millisecondes. Une fois déclenché, il s’arrête. Pour le réutiliser, il suffit de le relancer.
Un timer de type every se déclenche à intervalles réguliers, également définis en millisecondes. Après chaque déclenchement, il se reprogramme automatiquement pour le prochain cycle.
Déclarer un timer
La syntaxe de déclaration est simple et lisible.
# Timer after : se déclenche une seule fois après 5 secondes
timer 'alerte' after 5000 do
{
"Temps écoulé !" ?
}
# Timer every : se déclenche toutes les secondes
timer 'ticker' every 1000 do
{
now ->date ->vars
"{! hour}:{! minute}:{! second}" eval ?
}
La déclaration seule ne suffit pas : il faut ensuite activer le timer avec timer.start.
Contrôler un timer
MOGWAI propose un ensemble de fonctions pour gérer le cycle de vie d’un timer :
'nom' timer.start— active le timer'nom' timer.stop— stoppe le timer (sans le supprimer)'nom' timer.purge— supprime le timer'nom' timer.state— retournetruesi le timer est actiftimer.list— retourne la liste de tous les timers déclarés
Suspendre les déclenchements : DI et EI
Il peut arriver qu’on ait besoin de s’assurer qu’aucun timer ne se déclenche pendant une portion critique du code. MOGWAI s’inspire ici de la notion d’interruptions matérielles, bien connue des développeurs embarqués.
La fonction DI (Disable Interrupts) bloque le déclenchement de tous les timers. La fonction EI (Enable Interrupts) les réactive.
Point important : DI ne suspend pas les timers, il met en file d’attente leurs déclenchements. Quand EI est appelé, tous les déclenchements en attente s’exécutent dans l’ordre.
DI
# Section critique : aucun timer ne se déclenchera ici
# ... opérations sensibles ...
EI
# Les déclenchements en attente s'exécutent maintenant
Lancer du code différé avec after
Pour les cas simples où on veut juste exécuter du code après un délai, sans avoir besoin de contrôler le timer, MOGWAI propose un raccourci :
after 3000 do
{
"Ceci s'affiche après 3 secondes" ?
}
Ce raccourci crée un timer after anonyme. En contrepartie, il est impossible de l’annuler avant son déclenchement.
Exemple complet
Voici un exemple qui combine les deux types : un ticker affiche l’heure courante toutes les secondes, et un timer met fin à tout au bout de 10 secondes.
mogwai.reset
# Timer every : affiche l'heure chaque seconde
timer 'ticker' every 1000 do
{
now ->date ->vars
"{! hour}:{! minute}:{! second}" eval ?
}
# Timer after : arrête le ticker après 10 secondes
timer 'stopper' after 10000 do
{
'ticker' timer.stop
'ticker' timer.purge
"Terminé." ?
}
'ticker' timer.start
'stopper' timer.start
forever do { }
Le forever en fin de programme maintient le programme en vie le temps que les timers fassent leur travail.
Timers ou Tasks ?
Les timers sont légers et bien adaptés aux tâches périodiques simples — surveiller une valeur, déclencher une action après un délai, animer un affichage. Pour des traitements plus longs, avec gestion d’erreurs robuste et communication structurée, MOGWAI propose les Tasks, qui seront l’objet d’un article dédié.
MOGWAI — open source depuis février 2026 · GitHub · coding4phone.com
3 réflexions au sujet de “Les timers dans MOGWAI”