L'utilisation de threads ou de tâches parallèles est très souvent obligatoire afin de répondre au besoin de rapidité des utilisateurs.


Il n'est plus envisageable d'avoir une application figée pendant une acquisition de données, ou l'exécution d'un traitement qui pourrait aller 4 ou 8 fois plus vite grâce aux multiples coeurs du processeur.


Avec le WLangage de WINDEV, le lancement de traitements en tâche de fond est simplifié à l'extrême avec :


Mais attention, s'il est facile de lancer un traitement en arrière plan, il faut néanmoins être précautionneux sur l'UI de l'application : seuls les traitements exécutés dans le thread principal sont autorisés à mettre à jour l'interface (affecter un champ, remplir une liste, combo, table, zone répétée...).

Sans cela le mécanisme de sécurité du WLangage veille :

  • l'audit dynamique provoquera un warning d'exécution : "L'accès aux champs dans un thread secondaire peut provoquer des effets aléatoires. Supprimez ces appels...",
  • l'exécution peut être stoppée avec le retour "l'autodiagnostic des threads a détecté un comportement interne inattendu."


Pour un traitement exécuté dans un thread secondaire, voici ses possibilités pour exécuter un autre code dans le thread principal :

 

Une illustration avec les attributs d'extensions :


Rappelons que les types suivants sont "thread safe" : pile, file, liste. Ces types gèrent automatiquement les accès concurrents des différents threads. On peut donc sans programmation particulière, sans section critique, avoir un thread secondaire qui va remplir une file avec des données acquises en tâche de fond, et un traitement (timer le plus souvent) du thread principal qui va vider la file pour afficher ses données.

 

 

Déjà publié sur le même sujet :

https://blogs.pcsoft.fr/fr/manipulation-ihm-ouverture-fenetre-thread-secondaire-preferer-fonctions-wlangage-echange-messages/121/read.awp

 

============ Mise à jour 24/1/2022 ============

Ressources également disponibles sur le sujet :

  • LST 125, page 18 : Thread ou tâche parallèle : voici comme faire le bon choix.
  • LST 121, page 12: Accès aux champs depuis un thread secondaire: 4 méthodes détaillées.
  • LST 113, page 24 : Best practive Android / iOS : exécuter un traitement en tâche de fond.
  • LST 112, page 16 : Best Practice : threads et tâches parallèles, comment partager des ressources : variables, requêtes, fichiers, etc..
  • LST 112, page 66: Des applications fluides grâce à la parallélisation.
  • LST 106, page 20 : WLangage devenez maître des sections critiques (threads).
  • LST 104, page 28: Best Practice: des traite?ments plus rapides : paralléliser une boucle.
  • LST 103, Parallélisation de traitements : soyez thread safe !
  • LST 101, page 10: Tâches parallèles : déclencher? une tâche selon d'autres tâches.
  • LST 100, page 32 : Ne faites plus attendre l'utilisateur, mise en oeuvre des tâches parallèles.
  • LST 81, page 18 : Ne perdez plus le fil de vos threads !

< Retour

6 commentaires

Thierry
22/01/2022 - 02:41 - Répondre
Merci pour cet article qui améliore davantage notre compréhension de la programmation informatique. Toutefois j'ai une question, j'aimerais comprendre la différence entre tâche parallèle et thread

Guillaume BAYLE
24/01/2022 - 08:47 - Répondre
Bonjour, en utilisant des threads il vous appartient de gérer si besoin un pool de threads en fonction des besoins de l'application et des possibilités du processeur disponible. Les tâches parallèles gèrent automatiquement un pool de threads (cf. TâcheParallèleParamètre), et facilitent la mise en place d'une procédure de continuation. J'ai ajouté dans le billet les ressources supplémentaires disponibles. Bons développements !

patrice
05/11/2023 - 14:56 - Répondre
Bonjour, si on lance des taches paralelles dans un thread, c'est géré , ou c'est trés déconseillé

Loïc HAMEL
06/11/2023 - 11:08 - Répondre
Les tâches parallèles gèrent des Thread de manière automatique. Ce n’est pas conseillé de les utiliser à l’intérieur d’un Thread et surtout ce n’est pas utile.

Patrice
03/12/2023 - 10:10 - Répondre
Désolé, je n'avais pas vu votre réponse, mais mon problèmes reste entier, j'ai un exemple: j'ai un programme principal qui affiche des info sur des postes ou j'ai besoin de garder la main, mais j'ai besoin de savoir si c'est poste sont en ligne, en permanence, il y a des ping toute les 30s. donc je fait un thread qui lance des tache parallèle pour faire des ping sur les diffèrent postes. Si ce n'est pas un cas ou ce serait nécessaire, je devrait faire quoi a la place?

Publier un commentaire : 
Votre adresse email ne sera pas publiée