|
- Présentation
- Gestion simple des threads
- Principe
- Fonctions WLangage
- Caractéristiques d'un thread
- Caractéristiques des threads
- Accès aux éléments existants et contexte HFSQL
- Recommandations pour les traitements réalisés par le thread
- Traitements interdits
- Traitements d'une application WINDEV
- Traitement d'exception et threads
Principe d'exécution des threads
Lorsqu'une application est en cours d'exécution, cette application s'exécute dans un thread principal. A tout moment, cette application peut lancer un thread secondaire : ce thread s'exécute en parallèle de l'application. Ce thread correspond à une procédure (locale ou globale) de l'application. Ce thread secondaire va s'exécuter en parallèle de l'application principale. Il est possible de réaliser dans ce thread tous les traitements réalisables en tâche de fond : réception des emails, ... Remarque : un thread efficace est un thread qui attend un événement spécifique, par exemple une action de l'utilisateur, la réception d'un appel téléphonique ou d'un email, ... Remarque : A partir de la version 19, HFSQL est le nouveau nom de HyperFileSQL. Versions 17 et supérieures Nouveauté 17 Versions 21 et supérieures Nouveauté 21 Gestion simple des threads Principe Un thread secondaire est créé avec la fonction ThreadExécute.Un thread secondaire est automatiquement arrêté lorsque : - la procédure correspondant au thread est terminée,
- l'objet à l'origine de thread est fermé.
Pour forcer l'arrêt : - d'un thread secondaire, utilisez la fonction ThreadArrête.
Versions 19 et supérieuresdu thread en cours, utilisez la fonction ThreadFin. Nouveauté 19du thread en cours, utilisez la fonction ThreadFin. du thread en cours, utilisez la fonction ThreadFin.
Attention : Si lors de l'arrêt d'un thread, une fonction WLangage est en cours d'exécution, l'arrêt ne sera effectif qu'après l'exécution de la fonction. Fonctions WLangage Les fonctions suivantes permettent une gestion simple des threads :
| | ThreadArrête | Arrête un thread secondaire. Fonction déconseillée. | ThreadAttend | Attend la fin de l'exécution du thread désigné. | ThreadCourant | Renvoie le nom du thread en cours d'exécution. | ThreadEtat | Renvoie l'état actuel d'un thread. | ThreadExécute | Lance l'exécution d'un thread secondaire. | ThreadFin | Termine l'exécution du thread en cours. | ThreadMode | Change le mode de gestion des threads. | ThreadPause | Temporise le thread en cours pour la durée indiquée. | ThreadPriorité | Renvoie ou modifie le niveau de priorité d'un thread. | ThreadReprend | Relance l'exécution d'un "thread" précédemment suspendu par la fonction ThreadSuspend. Fonction déconseillée. | ThreadSuspend | Suspend temporairement l'exécution du thread désigné. Fonction déconseillée. |
Caractéristiques d'un thread Caractéristiques des threads En WLangage, un thread secondaire peut être associé à : - une procédure locale à la fenêtre en cours,
- une procédure globale au projet,
- une méthode de classe,
- une méthode globale de classe.
Accès aux éléments existants et contexte HFSQL Lors de la création d'un thread, toutes les déclarations, objets, éléments existants sont communs : - au nouveau thread secondaire.
- au thread dans lequel le thread secondaire a été créé (dans la plupart des cas, correspond au thread principal).
Ces threads peuvent ainsi accéder aux variables, procédures, ... Toutes les variables créées après le lancement d'un thread sont accessibles uniquement dans le thread où elles sont créées. De même, lors de la création d'un thread, le contexte HFSQL est automatiquement dupliqué. Chaque thread manipule un contexte HFSQL spécifique. 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. 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.
Exemple : | | Code Thread 1 | Code Thread 2 | a=i a++ i=a | b=i b++ i=b |
Ces deux threads partagent les variables mais ne gèrent pas l'accès aux ressources communes. Si le thread 1 est exécuté avant le thread 2, i vaudra 1 au lieu de 2. Recommandations pour les traitements réalisés par le thread 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.
|
Traitements d'une application WINDEV Par défaut, tout événement WINDEV (code de clic d'un bouton par exemple), toutes les procédures, les méthodes des classes ne peuvent être exécutés que par un seul thread à un moment donné. Pour permettre à plusieurs threads d'exécuter ces traitements en même temps, il est nécessaire de : - Changer le mode de gestion par défaut des threads (fonction ThreadMode).
- Gérer dans le code de l'application les sections critiques et les sémaphores.
Traitement d'exception et threads Si un traitement d'exception général est effectué dans le code d'initialisation du projet, il sera déclenché si une exception survient : - dans le thread principal,
- dans un thread secondaire lancé par la fonction ThreadExécute.
Cependant, si le thread secondaire déclenche une exception, il ne sera pas possible de connaître son origine avec la fonction ExceptionInfo dans le code du projet. Pour connaître l'origine d'une exception dans un thread secondaire, il faut inclure le traitement de l'exception dans le thread secondaire.
Liste des exemples associés :
|
Exemples unitaires (WINDEV Mobile) : Les threads
[ + ] Utilisation des threads dans une application : - exécuter une procédure sous forme d'un thread - arrêter un thread - exécuter une procédure nécessitant des paramètres sous forme d'un thread
|
|
Exemples unitaires (WINDEV Mobile) : Les threads (pool)
[ + ] Utilisation des threads avec les fonctions WLangage. Dans cet exemple, nous abordons 2 thèmes principaux : 1/ L'exécution de processus lancés en parallèle (threads) 2/ Comment limiter le nombre de threads en exécution à un instant donné 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, ...). Les threads sont très utiles dans le domaine industriel: superviseur, applications avec contrôle de process en temps réel,…
|
|
Exemples unitaires (WINDEV) : Les threads
[ + ] Utilisation des threads dans une application : - Exécuter une procédure sous forme d'un thread - Arrêter un thread - Exécuter une procédure nécessitant des paramètres sous forme d'un thread
|
|
Exemples unitaires (WINDEV) : Les threads (pool)
[ + ] Utilisation des threads : - Exécution de processus lancés en parallèle - Limitation du nombre de threads en exécution à un instant donné 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, ...). Les threads sont très utiles dans le domaine industriel: superviseur, applications avec contrôle de process en temps réel,…
|
|
Exemples didactiques (WINDEV) : WD Utilisation des sockets
[ + ] Cet exemple illustre les fonctions "Socket" de WINDEV dans une utilisation de type client/serveur. Dans cet exemple, nous abordons deux thèmes principaux : 1/ Comment se connecter à une socket 2/ Comment accepter une demande de connexion 3/ Comment écrire ou lire sur une socket Résumé de l'exemple livré avec WINDEV : Cet exemple présente les différentes fonctions de gestion des sockets livrées en standard avec WINDEV. Pour utiliser cet exemple, il est nécessaire de lancer une première instance de l'exemple en mode "serveur". Ensuite, en donnant le nom de la machine faisant office de serveur et un pseudonyme, vous pouvez vous connecter à cette application en mode "client". Il est alors possible d'envoyer des messages à tous les utilisateurs connectés. Dans cet exemple, à chaque connexion est associée : un thread et une socket .
|
Documentation également disponible pour…
|
|
|
| |
| Cliquez sur [Ajouter] pour publier un commentaire |
|
| |
|
| |
| |
| |
| |
| |
| |
| | |
| |