{"id":2050,"date":"2026-03-26T11:44:29","date_gmt":"2026-03-26T10:44:29","guid":{"rendered":"https:\/\/coding4phone.com\/?p=2050"},"modified":"2026-03-30T20:48:14","modified_gmt":"2026-03-30T19:48:14","slug":"les-timers-dans-mogwai","status":"publish","type":"post","link":"https:\/\/coding4phone.com\/?p=2050","title":{"rendered":"Les timers dans MOGWAI"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Dans un programme, il est souvent n\u00e9cessaire d&rsquo;ex\u00e9cuter du code \u00e0 un moment pr\u00e9cis dans le futur, ou de fa\u00e7on r\u00e9p\u00e9t\u00e9e \u00e0 intervalles r\u00e9guliers \u2014 sans pour autant bloquer le reste du programme. C&rsquo;est exactement le r\u00f4le des <strong>timers<\/strong> dans <a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"une-stack-isolee\">Une stack isol\u00e9e<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avant d&rsquo;entrer dans le vif du sujet, il y a un point de design important \u00e0 comprendre : <strong>le code d&rsquo;un timer s&rsquo;ex\u00e9cute sur sa propre stack<\/strong>, s\u00e9par\u00e9e de celle du programme principal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cette isolation est intentionnelle. Comme un timer peut se d\u00e9clencher \u00e0 n&rsquo;importe quel moment, il ne doit pas perturber l&rsquo;\u00e9tat de la stack principale. En revanche, le code d&rsquo;un timer a acc\u00e8s aux <strong>variables globales<\/strong> du programme en cours \u2014 c&rsquo;est le m\u00e9canisme naturel pour communiquer des donn\u00e9es entre le programme principal et ses timers.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"les-deux-types-de-timers\">Les deux types de timers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> propose deux comportements distincts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un timer de type <strong><code>after<\/code><\/strong> se d\u00e9clenche <strong>une seule fois<\/strong>, apr\u00e8s un d\u00e9lai d\u00e9fini en millisecondes. Une fois d\u00e9clench\u00e9, il s&rsquo;arr\u00eate. Pour le r\u00e9utiliser, il suffit de le relancer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un timer de type <strong><code>every<\/code><\/strong> se d\u00e9clenche <strong>\u00e0 intervalles r\u00e9guliers<\/strong>, \u00e9galement d\u00e9finis en millisecondes. Apr\u00e8s chaque d\u00e9clenchement, il se reprogramme automatiquement pour le prochain cycle.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"declarer-un-timer\">D\u00e9clarer un timer<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La syntaxe de d\u00e9claration est simple et lisible.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Timer after : se d\u00e9clenche une seule fois apr\u00e8s 5 secondes<br><br>timer 'alerte' after 5000 do<br>{<br>    \"Temps \u00e9coul\u00e9 !\" ?<br>}<br><br># Timer every : se d\u00e9clenche toutes les secondes<br><br>timer 'ticker' every 1000 do<br>{<br>    now -&gt;date -&gt;vars<br>    \"{! hour}:{! minute}:{! second}\" eval ?<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La d\u00e9claration seule ne suffit pas : il faut ensuite <strong>activer<\/strong> le timer avec <code>timer.start<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"controler-un-timer\">Contr\u00f4ler un timer<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> propose un ensemble de fonctions pour g\u00e9rer le cycle de vie d&rsquo;un timer :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>'nom' timer.start<\/code> \u2014 active le timer<\/li>\n\n\n\n<li><code>'nom' timer.stop<\/code> \u2014 stoppe le timer (sans le supprimer)<\/li>\n\n\n\n<li><code>'nom' timer.purge<\/code> \u2014 supprime le timer<\/li>\n\n\n\n<li><code>'nom' timer.state<\/code> \u2014 retourne <code>true<\/code> si le timer est actif<\/li>\n\n\n\n<li><code>timer.list<\/code> \u2014 retourne la liste de tous les timers d\u00e9clar\u00e9s<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"suspendre-les-declenchements--di-et-ei\">Suspendre les d\u00e9clenchements : <strong>DI<\/strong> et <strong>EI<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il peut arriver qu&rsquo;on ait besoin de s&rsquo;assurer qu&rsquo;aucun timer ne se d\u00e9clenche pendant une portion critique du code. <a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> s&rsquo;inspire ici de la notion d&rsquo;<strong>interruptions mat\u00e9rielles<\/strong>, bien connue des d\u00e9veloppeurs embarqu\u00e9s.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La fonction <code>DI<\/code> <em>(Disable Interrupts)<\/em> bloque le d\u00e9clenchement de tous les timers. La fonction <code>EI<\/code> <em>(Enable Interrupts)<\/em> les r\u00e9active.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Point important : <code>DI<\/code> ne suspend pas les timers, il <strong>met en file d&rsquo;attente<\/strong> leurs d\u00e9clenchements. Quand <code>EI<\/code> est appel\u00e9, tous les d\u00e9clenchements en attente s&rsquo;ex\u00e9cutent dans l&rsquo;ordre.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">DI<br><br># Section critique : aucun timer ne se d\u00e9clenchera ici<br># ... op\u00e9rations sensibles ...<br><br>EI<br><br># Les d\u00e9clenchements en attente s'ex\u00e9cutent maintenant<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"lancer-du-code-differe-avec-after\">Lancer du code diff\u00e9r\u00e9 avec <strong>after<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour les cas simples o\u00f9 on veut juste ex\u00e9cuter du code apr\u00e8s un d\u00e9lai, sans avoir besoin de contr\u00f4ler le timer, <a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> propose un raccourci :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">after 3000 do<br>{<br>    \"Ceci s'affiche apr\u00e8s 3 secondes\" ?<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ce raccourci cr\u00e9e un timer <code>after<\/code> anonyme. En contrepartie, il est impossible de l&rsquo;annuler avant son d\u00e9clenchement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"exemple-complet\">Exemple complet<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Voici un exemple qui combine les deux types : un ticker affiche l&rsquo;heure courante toutes les secondes, et un timer met fin \u00e0 tout au bout de 10 secondes.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mogwai.reset<br><br># Timer every : affiche l'heure chaque seconde<br><br>timer 'ticker' every 1000 do<br>{<br>    now -&gt;date -&gt;vars<br>    \"{! hour}:{! minute}:{! second}\" eval ?<br>}<br><br># Timer after : arr\u00eate le ticker apr\u00e8s 10 secondes<br><br>timer 'stopper' after 10000 do<br>{<br>    'ticker' timer.stop<br>    'ticker' timer.purge<br>    \"Termin\u00e9.\" ?<br>}<br><br>'ticker' timer.start<br>'stopper' timer.start<br><br>forever do { }<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le <code>forever<\/code> en fin de programme maintient le programme en vie le temps que les timers fassent leur travail.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"timers-ou-tasks-\">Timers ou Tasks ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Les timers sont l\u00e9gers et bien adapt\u00e9s aux <strong>t\u00e2ches p\u00e9riodiques simples<\/strong> \u2014 surveiller une valeur, d\u00e9clencher une action apr\u00e8s un d\u00e9lai, animer un affichage. Pour des traitements plus longs, avec gestion d&rsquo;erreurs robuste et communication structur\u00e9e, <a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> propose les <strong>Tasks<\/strong>, qui seront l&rsquo;objet d&rsquo;un article d\u00e9di\u00e9.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><em><a href=\"https:\/\/www.mogwai.eu.com\" target=\"_blank\" rel=\"noreferrer noopener\">MOGWAI<\/a> \u2014 open source depuis f\u00e9vrier 2026 \u00b7 <a href=\"https:\/\/github.com\/Sydney680928\/MOGWAI\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub<\/a> \u00b7 coding4phone.com<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans un programme, il est souvent n\u00e9cessaire d&rsquo;ex\u00e9cuter du code \u00e0 un moment pr\u00e9cis dans le futur, ou de fa\u00e7on r\u00e9p\u00e9t\u00e9e \u00e0 intervalles r\u00e9guliers \u2014 sans pour autant bloquer le reste du programme. C&rsquo;est exactement le r\u00f4le des timers dans MOGWAI. Une stack isol\u00e9e Avant d&rsquo;entrer dans le vif du sujet, il y a un &#8230; <a title=\"Les timers dans MOGWAI\" class=\"read-more\" href=\"https:\/\/coding4phone.com\/?p=2050\" aria-label=\"En savoir plus sur Les timers dans MOGWAI\">Lire la suite<\/a><\/p>\n","protected":false},"author":1,"featured_media":2058,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"D\u00e9couvrez comment utiliser les timers dans MOGWAI pour ex\u00e9cuter du code \u00e0 des moments pr\u00e9cis sans bloquer votre programme.","jetpack_seo_html_title":"Comprendre les Timers dans MOGWAI : Guide Complet","jetpack_seo_noindex":false,"jetpack_seo_schema_type":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[8,6,48,50],"tags":[],"class_list":["post-2050","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-mogwai","category-rpn","category-scripting"],"jetpack_publicize_connections":[],"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfoe4s-x4","jetpack-related-posts":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/03\/image-6.png?fit=1024%2C768&ssl=1","_links":{"self":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2050","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2050"}],"version-history":[{"count":9,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2050\/revisions"}],"predecessor-version":[{"id":2107,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2050\/revisions\/2107"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/media\/2058"}],"wp:attachment":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2050"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2050"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2050"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}