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
  • Caractéristique d'un thread créé en WLangage
  • Thread et HFSQL
  • Caractéristiques de la procédure WLangage
  • Durée de vie du thread
  • Gestion des erreurs
  • Traitements interdits
  • Arrêter un thread
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
Lance l'exécution d'un thread secondaire. L'instruction est non bloquante : les deux traitements s'exécutent en parallèle.
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, etc.).
Exemple
// Exécution d'un thread avec passage de paramètres 
sDate est une chaîne 
sDate = DateSys()
// Exécution du thread
ThreadExécute("THREADNAME", threadNormal, "pExecReq", (sDate))
// ---------------------------------------------------------
// Détail de la procédure "pExecReq" 
// Cette procédure attend une date en paramètre d'une requête 
PROCÉDURE pExecReq(sDate)
SI HExécuteRequête(Sup_Date, hRequêteDéfaut, sDate) = Faux ALORS
	Erreur(HErreurInfo())
SINON
	HLitPremier(Sup_Date)
FIN
// Syntaxe compatible
ThreadExécute("Thread1", threadNormal, ProcédureThread) 
...
// Appel d'une méthode globale d'une classe
ThreadExécute("Thread2", threadNormal, CClasse::MéthodeGlobale)
Syntaxe
Universal Windows 10 AppiPhone/iPadWidget IOSApple Watch

Déclarer et exécuter une variable de type Thread Masquer les détails

<Résultat> = ThreadExécute(<Procédure WLangage> [, <Paramètres>] [, <Options>])
<Résultat> : Variable de type Thread
Variable de type Thread correspondant au thread exécuté.
<Procédure WLangage> : Nom de procédure
Nom de la procédure WLangage exécutée. Cette procédure est exécutée en parallèle de l'exécution de l'application.
<Paramètres> : Liste de valeurs entre parenthèses et séparées par des virgules
Paramètres de la procédure à exécuter. Cette liste de paramètres est de la forme :
(<Paramètre 1>, ..., <Paramètre N>)
où :
  • <Paramètre 1> : Premier paramètre de la procédure.
  • ...
  • <Paramètre N> : Nième paramètre de la procédure.
Attention : Les paramètres sont passés par valeur. Dans le cas de variables de types complexes (tableaux, objet), la valeur est l'élément lui-même. Pour protéger l'accès à cette variable, il est possible d'utiliser une des solutions suivantes :
  • faire une copie de la variable (avec le mot clé LOCAL),
  • utiliser des sections critiques (avec la fonction WLangage SectionCritiqueDebut ou l'attribut <section critique>)
<Options> : Constante optionnelle
Mode de lancement du thread.
threadAttendDémarrageAttend le démarrage effectif du thread avant de continuer l'exécution.
Universal Windows 10 App Cette constante n'est pas disponible.
threadContexteGlobalForce l'utilisation du contexte global du projet si le thread est exécuté depuis une fenêtre. Le thread continuera donc de s'exécuter jusqu'à la fermeture de l'application.
Par défaut, le contexte de la fenêtre est utilisé, le thread est donc arrêté lors de la fermeture de la fenêtre.
Remarque : Si la fonction ThreadExécute est utilisée dans un code d'initialisation global (projet, classe ou collection) ou depuis toute procédure ou méthode appelée depuis un code d'initialisation global, cette constante n'a aucun effet.
Universal Windows 10 App Cette constante n'est pas disponible.
threadCopieComplèteContexteHFSQL
(Valeur par défaut)
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.
Universal Windows 10 App Cette constante n'est pas disponible.
threadCopieLégèreContexteHFSQLProvoque 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.
Universal Windows 10 App Cette constante n'est pas disponible.
threadNormalLance le thread en mode normal. Le contexte HFSQL est copié lors de la première utilisation d'une fonctionnalité HFSQL.
threadSécuriséLance un thread en mode sécurisé. Dans ce mode :
  • une erreur de compilation sera affichée si des accès aux champs sont effectués dans le thread.
  • 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).
Universal Windows 10 AppiPhone/iPadWidget IOSApple Watch

Exécuter un thread déjà décrit (variable de type Thread) Masquer les détails

<Résultat> = ThreadExécute(<Thread>)
<Résultat> : Variable de type Thread
Variable de type Thread correspondant au thread exécuté.
<Thread> : Variable de type Thread
Nom de la variable de type Thread correspondant au thread à exécuter.
Ce thread est un thread sécurisé, ce qui implique les éléments suivants:
  • une erreur de compilation sera affichée si des accès aux champs sont effectués dans le thread.
  • 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).
Attention : Si le thread est déjà en cours d'exécution ou a déjà été exécuté, une erreur WLangage sera provoquée.

Exécuter un thread en le nommant (Syntaxe compatible) Masquer les détails

ThreadExécute(<Nom du thread> , <Options> , <Procédure WLangage> [, <Paramètre 1> [... [, <Paramètre N>]]])
<Nom du thread> : Chaîne de caractères
Nom qui sera attribué au thread. Ce nom sera utilisé dans toutes les fonctions de gestion des threads. Ce nom ne peut pas correspondre à une chaîne vide ("")
<Options> : Constante
Mode de lancement du thread.
threadAttendDémarrageAttend le démarrage effectif du thread avant de continuer l'exécution.
Universal Windows 10 AppAndroidWidget Android Cette constante n'est pas disponible.
threadContexteGlobalForce l'utilisation du contexte global du projet si le thread est exécuté depuis une fenêtre. Le thread continuera donc de s'exécuter jusqu'à la fermeture de l'application.
Par défaut, le contexte de la fenêtre est utilisé, le thread est donc arrêté lors de la fermeture de la fenêtre.
Remarque : Si la fonction ThreadExécute est utilisée dans un code d'initialisation global (projet, classe ou collection) ou depuis toute procédure ou méthode appelée depuis un code d'initialisation global, cette constante n'a aucun effet.
Universal Windows 10 App Cette constante n'est pas disponible.
threadCopieComplèteContexteHFSQL
(Valeur par défaut)
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.
Universal Windows 10 App Cette constante n'est pas disponible.
threadCopieLégèreContexteHFSQLProvoque 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.
Universal Windows 10 App Cette constante n'est pas disponible.
threadNormalLance le thread en mode normal. Le contexte HFSQL est copié lors de la première utilisation d'une fonctionnalité HFSQL.
threadSécuriséLance un thread en mode sécurisé. Dans ce mode :
  • une erreur de compilation sera affichée si des accès aux champs sont effectués dans le thread.
  • 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).
<Procédure WLangage> : Nom de procédure
Nom de la procédure WLangage exécutée. Cette procédure est exécutée en parallèle de l'exécution de l'application.
<Paramètre 1> : Optionnel
Paramètres à passer à la procédure. Attention : ces paramètres sont passés par valeur (et non par référence).
<Paramètre N> : Optionnel
Paramètres à passer à la procédure. Attention : ces paramètres sont passés par valeur (et non par référence).
Remarques

Caractéristique d'un thread créé en WLangage

Un thread créé en WLangage ne peut être qu'une procédure ou une méthode de classe. Le thread ne peut pas correspondre à un traitement du WLangage (code d'un champ par exemple).
Si le thread est une méthode de classe, la fonction ThreadExécute doit être exécutée depuis un des traitements de la classe (constructeur ou méthode).

Thread et HFSQL

Lors de l'exécution de la fonction ThreadExécute, les contextes HFSQL sont automatiquement dupliqués : 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.
Il existe 2 méthodes pour copier les contextes HFSQL :
  • Copie de contexte complet (par défaut)
  • Copie de contexte légère.
Pour plus de détails sur la copie de contextes HFSQL et leurs limites (selon la base de données utilisée), consultez Gestion des contextes HFSQL.
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.

Caractéristiques de la procédure WLangage

Attention : Les appels aux fonctions Info, Erreur, ... bloquent tous les threads en cours d'exécution.
Universal Windows 10 AppAndroidWidget Android Les appels aux fonctions Info, Erreur, ... ne bloquent pas les threads en cours d'exécution.
Remarque : Les paramètres passés à la procédure sont passés par valeur et non par référence.

Durée de vie du thread

Le thread est automatiquement arrêté à la fin de l'exécution de la procédure WLangage lancée par la fonction ThreadExécute.
Le thread est également arrêté dans les cas suivants :
  • si la fonction ThreadExécute est appelée depuis le code d'une fenêtre, le thread sera arrêté à la fermeture de la fenêtre.
  • si la fonction ThreadExécute est appelée depuis un traitement global (initialisation, appel explicite dans le contexte principal), le thread sera arrêté à la fin de l'application.
  • si la fonction ThreadExécute est appelée dans une méthode de classe, le thread est arrêté à la destruction de l'objet.
Il est possible de forcer l'exécution du thread dans le contexte principal en utilisant la constante threadContexteGlobal.
Pour forcer l'arrêt du thread, utilisez la fonction ThreadArrête. Cette fonction peut être utilisée par exemple pour arrêter un thread depuis le thread principal.
Remarque : Il est conseillé de vérifier que les threads sont bien arrêtés (avec les fonctions ThreadEtat ou ThreadAttend) avant de fermer les fenêtres ou de détruire les objets.

Gestion des erreurs

Une erreur fatale est générée dans les cas suivants :
  • si la procédure n'existe pas.
  • si un thread de même nom est déjà en cours d'exécution.

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, etc.) 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, etc.) 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.
AndroidWidget Android

Arrêter un thread

En Android, la fonction ThreadArrête n'est pas disponible.
L'arrêt complet du thread peut être fait uniquement par le thread lui-même, à la fin de la procédure WLangage appelée par la fonction ThreadExécute.
Exemple :
ThreadExécute("th", threadNormal, ProcThread)
PROCEDURE ProcThread
bThreadEnVie est un booléen = Vrai
TANTQUE bThreadEnVie

// ... Traitement

// Test de la condition de fin du thread
SI <CONDITION FIN THREAD> ALORS
bThreadEnVie = Faux
FIN
FIN
Classification Métier / UI : Code neutre
Composante : wd300vm.dll
Version minimum requise
  • Version 9
Documentation également disponible pour…
Commentaires
Theads sur iOS
L'exécution de threads assez gourmands bloque l'exécution du thread principal et empêche l'utilisation de l'application.
Olivier DAWSON
12 déc. 2016

Dernière modification : 05/07/2024

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