|
- 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
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 (avec guillemets) 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. | | Versions 18 et supérieuresthreadAttendDémarrage Nouveauté 18threadAttendDémarrage threadAttendDémarrage | Attend le démarrage effectif du thread avant de continuer l'exécution. | Versions 16 et supérieuresthreadContexteGlobal Nouveauté 16threadContexteGlobal 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. | threadNormal | Lance le thread en mode normal. Le contexte HFSQL est copié lors de la première utilisation d'une fonctionnalité HFSQL. | 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. | Versions 20 et supérieuresthreadCopieLégèreContexteHFSQL Nouveauté 20threadCopieLégèreContexteHFSQL 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. |
<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). Versions 25 et supérieures Nouveauté 25 Versions 25 et supérieures Nouveauté 25Remarques 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)
Versions 20 et supérieuresCopie de contexte légère. Nouveauté 20Copie de contexte légère. 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.
Remarque : A partir de la version 19, HFSQL est le nouveau nom de HyperFileSQL. 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'interface (fenêtres, champs, ...) dans un thread secondaire. Lorsqu'un thread secondaire doit interagir avec l'utilisateur ou mettre à jour l'interface, 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 DemandeMiseAJourIHM.
|
Classification Métier / UI : Code neutre
Documentation également disponible pour…
|
|
|
| |
| | L'exécution de threads assez gourmands bloque l'exécution du thread principal et empêche l'utilisation de l'application. |
|
|
|
| |
| |
| |
| |
| |
| |
| | |
| |