Un thread secondaire lancé par ThreadExécute permet d'accélérer les applications en parallélisant des traitements, ou en déportant une tâche sans qu'elle ne soit bloquante pour l'utilisateur. Il en est de même avec l'utilisation d'une tâche parallèle. Une règle fondamentale pour les traitements exécutés depuis un thread secondaire, ou une tâche parallèle, est de ne pas avoir d'interaction avec l'interface de l'application :
- pas d'accès aux champs des fenêtres depuis une procédure exécutée dans un thread,
- pas d'ouverture de fenêtre ...
Toutes les actions sur l'IHM de l'application, doivent être faites depuis le thread principal de l'application.
Tout manquement à cette règle sera sanctionné par un déclenchement du mécanisme de sécurité du WLangage lors d'un accès à l'interface. Lorsqu'un traitement d'un thread secondaire doit mettre à jour l'interface (mise à jour d'un champ, affichage d'une notification...), le thread secondaire doit "demander" cet affichage au thread principal.
Cette "demande" peut être implémentée en utilisant des messages Windows (PostMessage / Evénement), cette solution est proposée dans la page d'aide suivante : gérer l'ouverture d'une fenêtre dans un thread secondaide
Il s'agit d'une solution qui était couramment utilisée dans les premières implémentations des threads en WLangage, il y a plus de 10 ans. D'autres solutions WLangage sont disponibles grâce aux évolutions faites depuis. Elles permettent de parvenir au même résultat, sans passer par des messages Windows. Elles sont à privilégier pour faciliter la mise au point :
- la fonction ExécuteThreadPrincipal, permet directement depuis le code d'un thread secondaire, de lancer une autre procédure qui sera elle exécutée dans le contexte du thread principal. Cette procédure est donc autorisée à interagir avec les champs de l'application.
- la fonction DemandeMiseAJourIHM, permet d'exécuter le traitement "Demande de mise à jour de l'affichage" d'une fenêtre via la fonction. Ce traitement spécifique des fenêtres est automatiquement exécuté par le thread principal
- la fonction TâcheParallèleExécuteAprèsToutes, grâce à son option tpoThreadPrincipal, elle permet de lancer une tâche de continuation exécutée par le thread principal, immédiatement après l'exécution d'un ensemble de tâches parallèles.
Pas encore de tâches parallèles en place pour accélérer vos applications ? Il ne faut plus hésiter grâce à ces possibilités !
Je profite de ce billet pour rappeler que la recherche proposée dans les ressources pratiques permet d'avoir immédiatement toutes les ressources disponibles sur un sujet donné. Ici la recherche de "thread" par exemple remontera les nombreuses illustrations proposées dans les exemples inclus, et les LST.
Mise à jour 14/10/2019
Les attributs d'extension facilitent la déclaration d'un traitement devant s'exécuter dans le thread principal :
https://blogs.pcsoft.fr/fr/utiliser-attributs-extension-procedures-internes-simplifier-ecriture-traitement-parallele-non-bloquant/281474976710836/read.awp |