{"id":2176,"date":"2026-04-07T10:27:13","date_gmt":"2026-04-07T09:27:13","guid":{"rendered":"https:\/\/coding4phone.com\/?p=2176"},"modified":"2026-04-07T10:28:10","modified_gmt":"2026-04-07T09:28:10","slug":"les-tasks-dans-mogwai","status":"publish","type":"post","link":"https:\/\/coding4phone.com\/?p=2176","title":{"rendered":"Les Tasks dans MOGWAI"},"content":{"rendered":"\n<p>Les <a href=\"https:\/\/coding4phone.com\/?p=2050\" target=\"_blank\" rel=\"noreferrer noopener\">timers<\/a> permettent d&rsquo;ex\u00e9cuter du code \u00e0 intervalles r\u00e9guliers, les <a href=\"https:\/\/coding4phone.com\/?p=2071\" target=\"_blank\" rel=\"noreferrer noopener\">\u00e9v\u00e9nements<\/a> de r\u00e9agir \u00e0 des d\u00e9clenchements ponctuels \u2014 mais que faire quand on a besoin d&rsquo;ex\u00e9cuter un traitement long <strong>en parall\u00e8le<\/strong> du programme principal, avec un vrai suivi de son \u00e9tat, un passage de param\u00e8tres structur\u00e9 et une gestion robuste des erreurs ? C&rsquo;est l\u00e0 qu&rsquo;interviennent les <strong>Tasks<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"le-modele-parentenfant\">Le mod\u00e8le parent\/enfant<\/h2>\n\n\n\n<p>Une Task enfant est un bloc de code qui s&rsquo;ex\u00e9cute <strong>en parall\u00e8le<\/strong> de la Task parente qui l&rsquo;a lanc\u00e9e. La Task parente peut continuer son propre travail pendant que ses enfants s&rsquo;ex\u00e9cutent.<\/p>\n\n\n\n<p>Comme les timers et les \u00e9v\u00e9nements, une Task enfant poss\u00e8de <strong>sa propre stack<\/strong>, isol\u00e9e de celle de la Task parente. En revanche, contrairement aux timers, les Tasks ne partagent pas les variables globales \u2014 elles communiquent exclusivement via des <strong>\u00e9v\u00e9nements syst\u00e8me<\/strong> d\u00e9di\u00e9s.<\/p>\n\n\n\n<p>Une Task enfant peut elle-m\u00eame cr\u00e9er des Tasks enfants. Il n&rsquo;y a pas de limite autre que la m\u00e9moire disponible, mais il est recommand\u00e9 de ne pas d\u00e9passer 50 \u00e0 100 Tasks simultan\u00e9es.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"declarer-une-task\">D\u00e9clarer une Task<\/h2>\n\n\n\n<p>La syntaxe de d\u00e9claration est proche de celle des timers :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\ntask &#039;T1&#039; do\n{\n    # Code de la Task enfant\n\n    &quot;Je m&#039;ex\u00e9cute en parall\u00e8le !&quot; ?\n    true task.setResult\n}\n<\/pre><\/div>\n\n\n<p>La d\u00e9claration ne lance pas la Task \u2014 elle la d\u00e9finit. C&rsquo;est <code>task...start...with<\/code> qui la d\u00e9marre.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"lancer-et-controler-une-task\">Lancer et contr\u00f4ler une Task<\/h2>\n\n\n\n<p>Le parent dispose des fonctions suivantes :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>task 'T1' start with objet<\/code> \u2014 lance la Task en lui passant un param\u00e8tre<\/li>\n\n\n\n<li><code>'T1' task.stop<\/code> \u2014 arr\u00eate la Task<\/li>\n\n\n\n<li><code>'T1' task.wait<\/code> \u2014 attend que la Task se termine avant de continuer<\/li>\n\n\n\n<li><code>('T1' 'T2' 'T3') task.join<\/code> \u2014 attend que toutes les Tasks list\u00e9es soient termin\u00e9es<\/li>\n\n\n\n<li><code>'T1' task.isRunning<\/code> \u2014 retourne <code>true<\/code> si la Task est en cours d&rsquo;ex\u00e9cution<\/li>\n\n\n\n<li><code>'T1' task.result<\/code> \u2014 retourne le r\u00e9sultat d\u00e9fini par la Task via <code>task.setResult<\/code><\/li>\n\n\n\n<li><code>'T1' task.purge<\/code> \u2014 supprime la Task (l&rsquo;arr\u00eate si elle tourne encore)<\/li>\n\n\n\n<li><code>task.list<\/code> \u2014 retourne la liste de toutes les Tasks d\u00e9clar\u00e9es<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"passer-des-parametres-a-une-task-enfant\">Passer des param\u00e8tres \u00e0 une Task enfant<\/h2>\n\n\n\n<p>Au lancement, la Task parente peut transmettre n&rsquo;importe quel objet MOGWAI \u00e0 la Task enfant via <code>start with<\/code>. Cet objet est automatiquement plac\u00e9 sur la stack de l&rsquo;enfant au d\u00e9marrage.<\/p>\n\n\n\n<p>En pratique, on utilise souvent un <strong>record<\/strong> pour passer plusieurs valeurs en une fois, combin\u00e9 \u00e0 <code>-&gt;vars<\/code> pour les \u00e9clater en variables locales :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\ntask &#039;T1&#039; do\n{\n    # Le param\u00e8tre est sur la stack au d\u00e9marrage\n\n    -&gt;vars\n\n    # Les variables locales &#039;url&#039; et &#039;filename&#039; sont maintenant disponibles\n\n    &quot;T\u00e9l\u00e9chargement de {! url}&quot; eval ?\n}\n\ntask &#039;T1&#039; start with &#x5B;url: &quot;https:\/\/example.com&quot; filename: &quot;page.bin&quot;]\n<\/pre><\/div>\n\n\n<p>Attention : lancer une Task d\u00e9j\u00e0 en cours d&rsquo;ex\u00e9cution provoque une erreur. Il est recommand\u00e9 de v\u00e9rifier avec <code>task.isRunning<\/code> avant de la relancer.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"communication-parent-\u2194-enfant\">Communication parent \u2194 enfant<\/h2>\n\n\n\n<p>La communication entre Tasks repose enti\u00e8rement sur des <strong>\u00e9v\u00e9nements syst\u00e8me<\/strong> que MOGWAI d\u00e9clenche automatiquement. Le parent d\u00e9clare les gestionnaires qui l&rsquo;int\u00e9ressent avec <code>onEvent<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"evenements-declenches-par-land39enfant-vers-le-parent\">\u00c9v\u00e9nements d\u00e9clench\u00e9s par l&rsquo;enfant vers le parent<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u00c9v\u00e9nement<\/th><th>Contenu de <code>eventData<\/code><\/th><\/tr><\/thead><tbody><tr><td><code>TASK_DID_START<\/code><\/td><td>Le nom de la Task (ex. <code>'T1'<\/code>)<\/td><\/tr><tr><td><code>TASK_DID_END<\/code><\/td><td>Un record <code>[task: 'T1' result: ...]<\/code><\/td><\/tr><tr><td><code>TASK_DID_FAIL<\/code><\/td><td>Un record <code>[task: 'T1' error: ... message: \"...\"]<\/code><\/td><\/tr><tr><td><code>TASK_DID_PUBLISH<\/code><\/td><td>Un record <code>[task: 'T1' message: ...]<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"evenement-declenche-par-le-parent-vers-land39enfant\">\u00c9v\u00e9nement d\u00e9clench\u00e9 par le parent vers l&rsquo;enfant<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u00c9v\u00e9nement<\/th><th>Contenu de <code>eventData<\/code><\/th><\/tr><\/thead><tbody><tr><td><code>TASK_DID_RECEIVE<\/code><\/td><td>L&rsquo;objet envoy\u00e9 par le parent via <code>task send<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"fonctions-de-communication-cote-enfant\">Fonctions de communication c\u00f4t\u00e9 enfant<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>objet task.publish<\/code> \u2014 envoie un message au parent via <code>TASK_DID_PUBLISH<\/code><\/li>\n\n\n\n<li><code>objet task.setResult<\/code> \u2014 d\u00e9finit le r\u00e9sultat final de la Task, r\u00e9cup\u00e9rable par le parent via <code>task.result<\/code><\/li>\n\n\n\n<li><code>task.name<\/code> \u2014 retourne le nom de la Task courante<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"envoyer-un-message-a-une-task-enfant-depuis-le-parent\">Envoyer un message \u00e0 une Task enfant depuis le parent<\/h3>\n\n\n<div class=\"wp-block-code\">\n\t<div class=\"cm-editor\">\n\t\t<div class=\"cm-scroller\">\n\t\t\t\n<pre><code><div class=\"cm-line\">task &apos;T1&apos; send &quot;message pour T1&quot;<\/div><\/code><\/pre>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n\n\n<p>L&rsquo;enfant re\u00e7oit ce message via l&rsquo;\u00e9v\u00e9nement <code>TASK_DID_RECEIVE<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"gestion-des-erreurs\">Gestion des erreurs<\/h2>\n\n\n\n<p>Si une Task enfant l\u00e8ve une erreur non g\u00e9r\u00e9e, elle s&rsquo;arr\u00eate automatiquement et l&rsquo;\u00e9v\u00e9nement <code>TASK_DID_FAIL<\/code> est d\u00e9clench\u00e9 dans la Task parente avec le code et le message d&rsquo;erreur.<\/p>\n\n\n\n<p>Il est donc fortement recommand\u00e9 d&rsquo;utiliser <code>guard<\/code> dans le code des Tasks enfants pour capturer les erreurs et retourner un r\u00e9sultat explicite :<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\ntask &#039;T1&#039; do\n{\n    -&gt;vars\n\n    guard\n    {\n        # code pouvant lever une erreur\n\n        true task.setResult\n    }\n    else\n    {\n        false task.setResult\n    }\n}\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"exemple-complet\">Exemple complet<\/h2>\n\n\n\n<p>Voici un programme qui t\u00e9l\u00e9charge trois pages web en parall\u00e8le et les sauvegarde sur disque. Chaque t\u00e9l\u00e9chargement est confi\u00e9 \u00e0 une Task enfant d\u00e9di\u00e9e.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; auto-links: false; gutter: false; title: ; quick-code: false; notranslate\" title=\"\">\nmogwai.reset\nconsole.clear\n\n# D\u00e9claration des \u00e9v\u00e9nements de suivi des Tasks\n\nonEvent &#039;TASK_DID_START&#039; do\n{\n    &quot;TASK DID START {! eventData}&quot; eval ?\n}\n\nonEvent &#039;TASK_DID_END&#039; do\n{\n    &quot;TASK DID END {! eventData}&quot; eval ?\n}\n\nonEvent &#039;TASK_DID_FAIL&#039; do\n{\n    &quot;TASK DID FAIL {! eventData}&quot; eval ?\n}\n\nonEvent &#039;TASK_DID_PUBLISH&#039; do\n{\n    &quot;TASK DID PUBLISH {! eventData}&quot; eval ?\n}\n\n# Pr\u00e9paration des param\u00e8tres pour chaque Task\n\n(\n    &#x5B;name: &#039;T1&#039; url: &quot;https:\/\/www.google.fr&quot;        filename: &quot;google.bin&quot;]\n    &#x5B;name: &#039;T2&#039; url: &quot;https:\/\/www.coding4phone.com&quot; filename: &quot;c4p.bin&quot;]\n    &#x5B;name: &#039;T3&#039; url: &quot;https:\/\/www.mogwai.eu.com&quot;    filename: &quot;mogwai.bin&quot;]\n)\n\nforeach &#039;item&#039; do\n{\n    item -&gt;vars\n\n    task name do\n    {\n        # Le param\u00e8tre pass\u00e9 par start with est sur la stack\n\n        -&gt;vars\n\n        now -&gt; &#039;begin&#039;\n\n        &#x5B;! http.get uri: url] -&gt; &#039;r&#039;\n\n        now begin - -&gt;duration -&gt; &#039;d&#039;\n\n        if (r-&gt;state) then\n        {\n            &quot;Dur\u00e9e du t\u00e9l\u00e9chargement : ({! d-&gt;ms} ms)&quot; eval task.publish\n\n            guard\n            {\n                filename r-&gt;response file.data.write\n                true task.setResult\n            }\n            else\n            {\n                false task.setResult\n            }\n        }\n        else\n        {\n            &quot;Erreur de t\u00e9l\u00e9chargement !&quot; task.publish\n            false task.setResult\n        }\n    }\n\n    task name start with &#x5B;url: url filename: filename]\n}\n\n# On attend que les trois Tasks soient termin\u00e9es\n\n(&#039;T1&#039; &#039;T2&#039; &#039;T3&#039;) task.join\n\n&quot;PROGRAMME TERMIN\u00c9&quot; ?\n<\/pre><\/div>\n\n\n<p>La sortie console ressemblera \u00e0 ceci :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">TASK DID START 'T3'<br>TASK DID START 'T2'<br>TASK DID START 'T1'<br>TASK DID PUBLISH [task: 'T2' message: \"Dur\u00e9e du t\u00e9l\u00e9chargement : (475 ms)\"]<br>TASK DID END [task: 'T2' result: true]<br>TASK DID PUBLISH [task: 'T1' message: \"Dur\u00e9e du t\u00e9l\u00e9chargement : (579 ms)\"]<br>TASK DID END [task: 'T1' result: true]<br>TASK DID PUBLISH [task: 'T3' message: \"Dur\u00e9e du t\u00e9l\u00e9chargement : (807 ms)\"]<br>TASK DID END [task: 'T3' result: true]<br>PROGRAMME TERMIN\u00c9<\/pre>\n\n\n\n<p>Les trois t\u00e9l\u00e9chargements se lancent quasi simultan\u00e9ment et se terminent dans l&rsquo;ordre de leur dur\u00e9e respective. <code>task.join<\/code> garantit que le programme n&rsquo;affiche \u00ab\u00a0PROGRAMME TERMIN\u00c9\u00a0\u00bb qu&rsquo;une fois tous les enfants termin\u00e9s.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"bonnes-pratiques\">Bonnes pratiques<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Toujours utiliser <code>guard<\/code> dans les Tasks enfants pour capturer les erreurs.<\/li>\n\n\n\n<li>Utiliser <code>task.setResult<\/code> pour retourner un statut de succ\u00e8s ou d&rsquo;\u00e9chec au parent.<\/li>\n\n\n\n<li>Pr\u00e9f\u00e9rer <code>task.join<\/code> aux boucles d&rsquo;attente avec <code>task.isRunning<\/code>.<\/li>\n\n\n\n<li>Ne pas d\u00e9passer 50 \u00e0 100 Tasks simultan\u00e9es pour ne pas saturer la m\u00e9moire.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"tasks-timers-ou-evenements-\">Tasks, timers ou \u00e9v\u00e9nements ?<\/h2>\n\n\n\n<p>Les trois m\u00e9canismes sont compl\u00e9mentaires. Les <strong><a href=\"https:\/\/coding4phone.com\/?p=2050\" target=\"_blank\" rel=\"noreferrer noopener\">timers<\/a><\/strong> sont id\u00e9aux pour les actions p\u00e9riodiques l\u00e9g\u00e8res. Les <strong><a href=\"https:\/\/coding4phone.com\/?p=2071\" target=\"_blank\" rel=\"noreferrer noopener\">\u00e9v\u00e9nements<\/a><\/strong> conviennent pour r\u00e9agir \u00e0 des d\u00e9clenchements ponctuels et d\u00e9coupler les composants du programme. Les <strong>Tasks<\/strong> s&rsquo;imposent d\u00e8s qu&rsquo;on a besoin d&rsquo;ex\u00e9cuter un traitement long en parall\u00e8le, avec un passage de param\u00e8tres structur\u00e9, un suivi de cycle de vie et une gestion d&rsquo;erreurs robuste.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les timers permettent d&rsquo;ex\u00e9cuter du code \u00e0 intervalles r\u00e9guliers, les \u00e9v\u00e9nements de r\u00e9agir \u00e0 des d\u00e9clenchements ponctuels \u2014 mais que faire quand on a besoin d&rsquo;ex\u00e9cuter un traitement long en parall\u00e8le du programme principal, avec un vrai suivi de son \u00e9tat, un passage de param\u00e8tres structur\u00e9 et une gestion robuste des erreurs ? C&rsquo;est l\u00e0 &#8230; <a title=\"Les Tasks dans MOGWAI\" class=\"read-more\" href=\"https:\/\/coding4phone.com\/?p=2176\" aria-label=\"En savoir plus sur Les Tasks dans MOGWAI\">Lire la suite<\/a><\/p>\n","protected":false},"author":1,"featured_media":2191,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"D\u00e9couvrez comment les Tasks permettent d'ex\u00e9cuter des traitements longs en parall\u00e8le, avec gestion des erreurs et communication structur\u00e9e.","jetpack_seo_html_title":"Comprendre les Tasks en programmation parall\u00e8le efficacement.","jetpack_seo_noindex":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_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,1,6,49,48,50],"tags":[],"class_list":["post-2176","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-uncategorized","category-mogwai","category-rpl","category-rpn","category-scripting"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/coding4phone.com\/wp-content\/uploads\/2026\/04\/coding-4-phone-69d4cd3a649d0.png?fit=1024%2C1024&ssl=1","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfoe4s-z6","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2176","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=2176"}],"version-history":[{"count":15,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2176\/revisions"}],"predecessor-version":[{"id":2192,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/posts\/2176\/revisions\/2192"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=\/wp\/v2\/media\/2191"}],"wp:attachment":[{"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2176"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2176"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coding4phone.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2176"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}