PC SOFT

DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

PV

  • 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
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, ...).
Exemple
ThreadExécute("Thread1", threadNormal, ProcédureThread)
...
// Appel d'une méthode globale d'une classe
ThreadExécute("Thread2", threadNormal, CClasse::MéthodeGlobale)
// 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

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.
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.
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.
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.
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 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).
WEBDEV - Code Serveur

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

<Résultat> = ThreadExécute(<Procédure WLangage> [, <Paramètre 1> [... [, <Paramètre N>]]] [, <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è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).
<Options> : Constante optionnelle
Mode de lancement du thread.
threadAttendDémarrageAttend le démarrage effectif du thread avant de continuer l'exécution.
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.
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.
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.
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 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).
WEBDEV - Code Serveur

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.
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.
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.
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, ...) 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.
Classification Métier / UI : Code neutre
Composante : wd280vm.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