|
|
|
|
|
- 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
ThreadExécute (Fonction) En anglais : ThreadExecute 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.).
sDate est une chaîne
sDate = DateSys()
ThreadExécute("THREADNAME", threadNormal, "pExecReq", (sDate))
PROCÉDURE pExecReq(sDate)
SI HExécuteRequête(Sup_Date, hRequêteDéfaut, sDate) = Faux ALORS
Erreur(HErreurInfo())
SINON
HLitPremier(Sup_Date)
FIN
ThreadExécute("Thread1", threadNormal, ProcédureThread)
...
ThreadExécute("Thread2", threadNormal, CClasse::MéthodeGlobale)
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émarrage | Attend le démarrage effectif du thread avant de continuer l'exécution. | threadContexteGlobal | Force 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èreContexteHFSQL | 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. | threadNormal | Lance 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. Remarque : Les paramètres passés à la procédure sont passés par valeur et non par référence. 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. 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.
|
Classification Métier / UI : Code neutre
Documentation également disponible pour…
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|