DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / WLangage / Fonctions WLangage / Fonctions standard / Fonctions de gestion des traitements / Threads, sémaphores, signaux et mutex
  • Présentation
  • Gestion simple des threads
  • Principe
  • Fonctions WLangage
  • Caractéristiques d'un thread
  • Caractéristiques des threads
  • Attributs d'extension liés aux threads
  • Accès aux éléments existants et contexte HFSQL
  • Recommandations pour les traitements réalisés par le thread
  • Traitements interdits
  • Traitements d'une application WINDEV
  • Traitement d'exception et threads
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac CatalystUniversal Windows 10 App
Autres
Procédures stockées
Présentation
Lorsqu'une application est en cours d'exécution, cette application s'exécute dans un thread principal.
A tout moment, cette application peut lancer un thread secondaire : ce thread s'exécute en parallèle de l'application. Ce thread correspond à une procédure (locale ou globale) de l'application.
Ce thread secondaire va s'exécuter en parallèle de l'application principale. Il est possible de réaliser dans ce thread tous les traitements réalisables en tâche de fond : réception des emails, ...
Remarque : un thread efficace est un thread qui attend un événement spécifique, par exemple une action de l'utilisateur, la réception d'un appel téléphonique ou d'un email, ...
Gestion simple des threads

Principe

Un thread secondaire est créé avec la fonction ThreadExécute.
Un thread secondaire est automatiquement arrêté lorsque :
  • la procédure correspondant au thread est terminée,
  • l'objet à l'origine de thread est fermé.
Pour forcer l'arrêt :
  • d'un thread secondaire :
    1. utilisez la fonction ThreadDemandeArrêt,
    2. testez le résultat de la fonction ThreadArrêtDemandé dans le thread secondaire afin de terminer l'exécution du thread par une sortie de la procédure, ou un appel de la fonction ThreadFin.
  • du thread en cours, utilisez la fonction ThreadFin.
Attention : Si lors de l'arrêt d'un thread, une fonction WLangage est en cours d'exécution, l'arrêt ne sera effectif qu'après l'exécution de la fonction.

Fonctions WLangage

Les fonctions suivantes permettent une gestion simple des threads :
ThreadArrêtDemandéVérifie si une demande d'arrêt a été envoyée au thread en cours d'exécution.
ThreadArrêteArrête un thread secondaire. Fonction déconseillée.
ThreadAttendAttend la fin de l'exécution du thread désigné.
ThreadCourantRenvoie le nom du thread en cours d'exécution.
ThreadDemandeArrêtEnvoie une demande d'arrêt à un thread.
ThreadEtatRenvoie l'état actuel d'un thread.
ThreadExécuteLance l'exécution d'un thread secondaire.
ThreadFinTermine l'exécution du thread en cours.
ThreadModeChange le mode de gestion des threads.
ThreadPauseTemporise le thread en cours pour la durée indiquée.
ThreadPrioritéRenvoie ou modifie le niveau de priorité d'un thread.
ThreadReprendRelance l'exécution d'un "thread" précédemment suspendu par la fonction ThreadSuspend. Fonction déconseillée.
ThreadSuspendSuspend temporairement l'exécution du thread désigné. Fonction déconseillée.

Pour plus de détails sur toutes les fonctions permettant de manipuler les threads, consultez Fonctions de gestion des threads.
Caractéristiques d'un thread

Caractéristiques des threads

En WLangage, un thread secondaire peut être associé à :
  • une procédure locale à la fenêtre en cours,
  • une procédure globale au projet,
  • une méthode de classe,
  • une méthode globale de classe.
Un thread secondaire peut être un thread sécurisé. Dans ce mode :
  • une erreur de compilation sera affichée si des accès aux champs sont effectués dans le thread (ou si la procédure utilise l'attribut "UI").
  • une exception sera générée :
    • si le thread accède aux champs en exécution,
    • si la fonction ThreadArrête est utilisée.
  • la fermeture de la fenêtre qui a lancé le thread provoque une demande d'arrêt (mais le thread peut continuer à s'exécuter après la fermeture de la fenêtre).

Attributs d'extension liés aux threads

Lors de la déclaration d'une procédure ou d'une méthode de classe, il est possible d'utiliser des attributs d'extension pour spécifier les caractéristiques du thread :
<thread>Permet d'indiquer que la procédure sera exécutée dans un thread secondaire.
Cet attribut d'extension est incompatible avec les attributs d'extension <timer> et <thread principal>.
<thread principal>Permet d'indiquer que la procédure sera exécutée dans le thread principal.
Cet attribut d'extension est incompatible avec les attributs d'extension <timer> et <thread>.
<thread principal asynchrone>Permet d'indiquer que la procédure sera exécutée dans le thread principal sans attendre la fin de l'exécution de la procédure.
Cet attribut d'extension est incompatible avec les attributs d'extension <timer> et <thread>.
<thread sécurisé>Permet d'indiquer que la procédure sera exécutée dans un thread secondaire sécurisé.
Cet attribut d'extension est incompatible avec les attributs d'extension <timer>, <thread principal> et <UI>.
<contexte HFSQL léger>Provoque la copie immédiate d'une partie du contexte HFSQL courant.
Seuls les répertoires où se trouvent les fichiers de données en HFSQL Classic et/ou les connexions en HFSQL Client/Serveur sont mémorisés.

Cet attribut d'extension doit être utilisé avec l'attribut d'extension <thread>.
Universal Windows 10 App Cet attribut d'extension n'est pas disponible.
<contexte HFSQL complet>Provoque la copie immédiate du contexte HFSQL courant.
Conseillé par exemple si le thread doit tenir compte des positions en cours dans les fichiers et requêtes du contexte de l'appelant.

Cet attribut d'extension doit être utilisé avec l'attribut d'extension <thread>.
Universal Windows 10 App Cet attribut d'extension n'est pas disponible.

Remarque : Il est également possible d'utiliser l'interface de l'éditeur de code, via les Procédures automatiques.

Accès aux éléments existants et contexte HFSQL

Lors de la création d'un thread, toutes les déclarations, objets, éléments existants sont communs :
  • au nouveau thread secondaire.
  • au thread dans lequel le thread secondaire a été créé (dans la plupart des cas, correspond au thread principal).
Ces threads peuvent ainsi accéder aux variables, procédures, ... Toutes les variables créées après le lancement d'un thread sont accessibles uniquement dans le thread où elles sont créées.
De même, lors de la création d'un thread, le contexte HFSQL est automatiquement dupliqué. Chaque thread manipule un contexte HFSQL spécifique. Il y a autant de contextes HFSQL que de threads en cours d'exécution. La totalité du contexte HFSQL est recopiée (filtre, condition de recherche, ...). Dans chaque thread, le contexte HFSQL évolue indépendamment.
Il est ainsi possible par exemple de réaliser deux parcours différents sur le même fichier de données dans deux threads différents.
Exemple :
  • Un filtre est créé sur le fichier de données Client.
  • La fonction ThreadExécute est appelée pour créer le thread CTX2.
  • Dans chaque thread (thread principal et thread CTX2), le fichier de données client est filtré. Si dans le thread principal, le filtre est désactivé, le filtre sera toujours actif dans le thread CTX2.
Cas particuliers :
  • Gestion assistée des erreurs HFSQL : Si plusieurs threads sont utilisés sur des fichiers de données, il est conseillé de personnaliser la gestion des erreurs HFSQL pour ne pas afficher les fenêtres par défaut. Pour cela, utilisez la fonction HSurErreur pour désactiver la gestion automatique des erreurs ou pour rediriger la gestion des erreurs vers une procédure personnalisée (sans affichage de fenêtres). Pour plus de détails, consultez Gestion assistée des erreurs HFSQL.
  • Ecritures et affectations dans un thread : Si des écritures ou des affectations sont effectuées dans un thread, les autres threads en cours d'exécution ne partagent pas ces informations. Certaines incohérences peuvent apparaître.
Exemple :
Code Thread 1Code Thread 2
a=i
a++
i=a
b=i
b++
i=b

Ces deux threads partagent les variables mais ne gèrent pas l'accès aux ressources communes. Si le thread 1 est exécuté avant le thread 2, i vaudra 1 au lieu de 2.
Remarque : Pour partager une affectation entre plusieurs threads, il est nécessaire d'utiliser des sémaphores. Pour plus de détails, consultez Gérer les sémaphores dans les threads.
Recommandations pour les traitements réalisés par le thread

Traitements interdits

Attention : Il n'est pas possible d'exécuter dans les threads les traitements suivants :
Attention : il est interdit de manipuler l'UI (fenêtres, champs, ...) dans un thread secondaire.
Lorsqu'un thread secondaire doit interagir avec l'utilisateur ou mettre à jour l'UI, il doit utiliser un traitement lancé depuis le thread principal. Ce traitement peut correspondre à :
  • une procédure globale du projet ou une procédure locale (d'une fenêtre, ...) appelée par la fonction ExécuteThreadPrincipal,
  • l'événement "Demande de mise à jour de l'affichage" d'une fenêtre exécuté grâce à la fonction DemandeMiseAJourUI.

Traitements d'une application WINDEV

Par défaut, tout événement WINDEV (code de clic d'un bouton par exemple), toutes les procédures, les méthodes des classes ne peuvent être exécutés que par un seul thread à un moment donné.
Pour permettre à plusieurs threads d'exécuter ces traitements en même temps, il est nécessaire de :
  1. Changer le mode de gestion par défaut des threads (fonction ThreadMode).
  2. Gérer dans le code de l'application les sections critiques et les sémaphores.
Java En Java, tout événement (code de clic d'un bouton par exemple), toutes les procédures, les méthodes de classes peuvent être exécutées par plusieurs threads en même temps. Pour empêcher que plusieurs threads exécutent le même code en même temps, il est nécessaire d'ajouter dans le code de l'application des sections critiques ou des sémaphores.

Traitement d'exception et threads

Si un traitement d'exception général est effectué dans le code d'initialisation du projet, il sera déclenché si une exception survient :
  • dans le thread principal,
  • dans un thread secondaire lancé par la fonction ThreadExécute.
Cependant, si le thread secondaire déclenche une exception, il ne sera pas possible de connaître son origine avec la fonction ExceptionInfo dans le code du projet. Pour connaître l'origine d'une exception dans un thread secondaire, il faut inclure le traitement de l'exception dans le thread secondaire.
Liste des exemples associés :
Les threads Exemples unitaires (WINDEV Mobile) : Les threads
[ + ] Utilisation des threads dans une application :
- exécuter une procédure sous forme d'un thread
- arrêter un thread
- exécuter une procédure nécessitant des paramètres sous forme d'un thread
Les threads Exemples unitaires (WINDEV) : Les threads
[ + ] Utilisation des threads dans une application :
- Exécuter une procédure sous forme d'un thread
- Arrêter un thread
- Exécuter une procédure nécessitant des paramètres sous forme d'un thread
Les threads (pool) Exemples unitaires (WINDEV) : Les threads (pool)
[ + ] Utilisation des threads :
- Exécution de processus lancés en parallèle
- Limitation du nombre de threads en exécution à un instant donné

Rappel: un "thread" est un processus lancé en parallèle de l'application en cours ("thread" principal).
Il est par exemple possible de lancer l'exécution d'une tâche en traitement de fond (sauvegarde, ...).
Les threads sont très utiles dans le domaine industriel: superviseur, applications avec contrôle de process en temps réel,…
WD Utilisation des sockets Exemples didactiques (WINDEV) : WD Utilisation des sockets
[ + ] Cet exemple illustre les fonctions "Socket" de WINDEV dans une utilisation de type client/serveur.
Dans cet exemple, nous abordons deux thèmes principaux :
1/ Comment se connecter à une socket
2/ Comment accepter une demande de connexion
3/ Comment écrire ou lire sur une socket
Résumé de l'exemple livré avec WINDEV :
Cet exemple présente les différentes fonctions de gestion des sockets livrées en standard avec WINDEV. Pour utiliser cet exemple, il est nécessaire de lancer une première instance de l'exemple en mode "serveur". Ensuite, en donnant le nom de la machine faisant office de serveur et un pseudonyme, vous pouvez vous connecter à cette application en mode "client". Il est alors possible d'envoyer des messages à tous les utilisateurs connectés. Dans cet exemple, à chaque connexion est associée : un thread et une socket .
Version minimum requise
  • Version 9
Documentation également disponible pour…
Commentaires
Cliquez sur [Ajouter] pour publier un commentaire

Dernière modification : 21/06/2023

Signaler une erreur ou faire une suggestion | Aide en ligne locale