PC SOFT

DOCUMENTATION EN LIGNE
DE WINDEV, WEBDEV ET WINDEV MOBILE

  • 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/iPadApple WatchUniversal Windows 10 AppWindows Mobile
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, ...).
Versions 15 et supérieures
WINDEV MobileAndroid Cette fonction est désormais disponible pour les applications Android.
Nouveauté 15
WINDEV MobileAndroid Cette fonction est désormais disponible pour les applications Android.
WINDEV MobileAndroid Cette fonction est désormais disponible pour les applications Android.
Versions 16 et supérieures
WINDEV MobileUniversal Windows 10 App Cette fonction est désormais disponible pour les applications Windows Phone.
Nouveauté 16
WINDEV MobileUniversal Windows 10 App Cette fonction est désormais disponible pour les applications Windows Phone.
WINDEV MobileUniversal Windows 10 App Cette fonction est désormais disponible pour les applications Windows Phone.
Versions 18 et supérieures
WINDEVWINDEV MobileUniversal Windows 10 App Cette fonction est désormais disponible en mode Windows Store apps.
WINDEV MobileWidget Android Cette fonction est désormais disponible en mode Widget Android.
Nouveauté 18
WINDEVWINDEV MobileUniversal Windows 10 App Cette fonction est désormais disponible en mode Windows Store apps.
WINDEV MobileWidget Android Cette fonction est désormais disponible en mode Widget Android.
WINDEVWINDEV MobileUniversal Windows 10 App Cette fonction est désormais disponible en mode Windows Store apps.
WINDEV MobileWidget Android Cette fonction est désormais disponible en mode Widget Android.
Versions 19 et supérieures
WINDEV MobileiPhone/iPad Cette fonction est désormais disponible pour les applications iPhone/iPad.
WINDEVLinux Cette fonction est désormais disponible pour les applications WINDEV sous Linux.
WEBDEV - Code ServeurLinux Cette fonction est désormais disponible pour les sites WEBDEV sous Linux.
Nouveauté 19
WINDEV MobileiPhone/iPad Cette fonction est désormais disponible pour les applications iPhone/iPad.
WINDEVLinux Cette fonction est désormais disponible pour les applications WINDEV sous Linux.
WEBDEV - Code ServeurLinux Cette fonction est désormais disponible pour les sites WEBDEV sous Linux.
WINDEV MobileiPhone/iPad Cette fonction est désormais disponible pour les applications iPhone/iPad.
WINDEVLinux Cette fonction est désormais disponible pour les applications WINDEV sous Linux.
WEBDEV - Code ServeurLinux Cette fonction est désormais disponible pour les sites WEBDEV sous Linux.
Versions 21 et supérieures
WINDEV MobileApple Watch Cette fonction est désormais disponible en mode Apple Watch.
WINDEVWINDEV MobileUniversal Windows 10 App Cette fonction est désormais disponible en mode Universal Windows 10 App.
Nouveauté 21
WINDEV MobileApple Watch Cette fonction est désormais disponible en mode Apple Watch.
WINDEVWINDEV MobileUniversal Windows 10 App Cette fonction est désormais disponible en mode Universal Windows 10 App.
WINDEV MobileApple Watch Cette fonction est désormais disponible en mode Apple Watch.
WINDEVWINDEV MobileUniversal Windows 10 App Cette fonction est désormais disponible en mode Universal Windows 10 App.
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
PROCEDURE pExecReq(sDate)
SI HExécuteRequête(Sup_Date, hRequêteDéfaut, sDate) = Faux ALORS
Erreur(HErreurInfo())
SINON
HLitPremier(Sup_Date)
FIN
Syntaxe
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érieures
threadAttendDémarrage
Nouveauté 18
threadAttendDémarrage
threadAttendDémarrage
Attend le démarrage effectif du thread avant de continuer l'exécution.
AndroidWidget AndroidUniversal Windows 10 AppJava Cette constante n'est pas disponible.
Versions 16 et supérieures
threadContexteGlobal
Nouveauté 16
threadContexteGlobal
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.
AndroidUniversal Windows 10 AppJava Cette constante n'est pas disponible.
Universal Windows 10 App Cette constante n'est pas disponible.
Versions 18 et supérieures
AndroidJava Cette constante est désormais disponible.
Nouveauté 18
AndroidJava Cette constante est désormais disponible.
AndroidJava Cette constante est désormais disponible.
threadNormalLance le thread en mode normal. Le contexte HFSQL est copié lors de la première utilisation d'une fonctionnalité HFSQL.
threadUtiliseHyperFile
Versions 19 et supérieures
threadUtiliseHFSQL
Nouveauté 19
threadUtiliseHFSQL
threadUtiliseHFSQL
Versions 20 et supérieures
threadCopieComplèteContexteHFSQL
Nouveauté 20
threadCopieComplèteContexteHFSQL
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.
AndroidWidget AndroidJava La constante threadCopieComplèteContexteHFSQL n'est pas disponible.
Versions 20 et supérieures
threadCopieLégèreContexteHFSQL
Nouveauté 20
threadCopieLé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.
AndroidWidget AndroidUniversal Windows 10 AppJava Cette constante n'est pas disponible.
<Procédure WLangage> : Chaîne de caractères (avec ou sans guillemets)
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 adresse).
<Paramètre N> : Optionnel
Paramètres à passer à la procédure. Attention : ces paramètres sont passés par valeur (et non par adresse).
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 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érieures
    Copie de contexte légère.
    Nouveauté 20
    Copie 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 Client. La fonction ThreadExécute est appelée pour créer le thread CTX2. Dans chaque thread, le fichier client est filtré. Si dans le thread principal, le filtre est désactivé, le filtre sera toujours actif dans le thread CTX2.
Attention : 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.
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.
AndroidWidget AndroidUniversal Windows 10 AppJava 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 adresse.
WINDEV Pour plus de détails sur les possibilités d'ouverture de fenêtres depuis un thread secondaire, consultez Gérer l'ouverture d'une fenêtre dans un thread secondaire.

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'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,
  • le traitement "Demande de mise à jour de l'affichage" d'une fenêtre exécuté grâce à la fonction DemandeMiseAJourIHM.
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
Composantes
WINDEVWEBDEV - Code ServeurEtats et Requêtes wd220vm.dll
Windows Mobile wp220vm.dll
Java wd220java.jar
Linux wd220vm.so
Android wd220android.jar
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