|
|
|
|
|
- Présentation
- Comment le faire ?
- Automatiser une procédure
- Cas des timers / Procédures différées
- Cas des threads : thread (pour compatibilité) et thread sécurisé
- Cas du thread principal
- Remarques
- Tableau récapitulatif
- Option "A la fin de l'événement contenant l'appel"
- Arrêter une procédure automatique
- Procédure avec lancement automatique de threads
- Programmation Orientée Objet (POO)
La programmation des timers, des threads, des procédures différées est désormais automatique, gérée par l'environnement. Au lieu de programmer les traitements et de les synchroniser par le code WLangage, il suffit de configurer les options d'automatisme de la procédure. C'est la fin des fonctions TimerSys, Timer, ThreadExécute, ... Ces fonctions sont bien entendu toujours présentes pour compatibilité. Voici quelques exemples de traitements définissables sans une seule ligne de code : - lancer une procédure toutes les 10 secondes (vérifier une boîte email, vérifier la présence d'un fichier sur le réseau, ...)
- idem, mais en ne commençant que 5 minutes après le lancement du programme.
- exécuter la procédure en tâche de fond (dans un thread), donc sans attendre sa valeur de retour.
Automatiser une procédure Pour automatiser une procédure : - Affichez le code de la procédure.
- Affichez la fenêtre de description des automatismes de la procédure :
- Cliquez sur l'icône présente dans le bandeau de la procédure.
- Sélectionnez l'option "Paramétrer les automatismes de la procédure" dans le menu contextuel de la procédure (volet "Explorateur de projet").
- Sélectionnez l'option "Propriétés" du menu contextuel de la procédure dans le volet "Code".
- Dans la fenêtre qui s'affiche, sélectionnez le type d'automatisme :
Cas des timers / Procédures différées Les options sont les suivantes : - Nombre de fois : La procédure peut être exécutée :
- une fois : la procédure s'arrêtera automatiquement après son exécution.
- plusieurs fois : la procédure s'exécutera plusieurs fois d'affilé. Dans ce cas, il est possible d'espacer les exécutions de la procédure. Un timer sera donc mis en place automatiquement.
- Espacement entre les appels : Lorsque l'exécution est multiple ou infinie, permet de définir le délai entre 2 exécutions.
- un nombre infini de fois : la procédure s'exécutera un nombre infini de fois. Dans ce cas, il est possible d'espacer les exécutions de la procédure. Un timer sera donc mis en place automatiquement.
- Il est possible de paramétrer les appels suivants de la procédure :
- Ignorer le timer et exécuter immédiatement la procédure :
Dans ce cas, un seul timer est en cours. Tout autre appel exécute immédiatement la procédure. Exemple : rafraîchissement automatique toutes les minutes, exécuté immédiatement si on presse F5. - Déclencher un nouveau timer :
Dans ce cas, plusieurs timers s'exécutent simultanément. Exemple : déclencher un "polling" sur des éléments passés en paramètre. - Relancer le timer existant :
Le timer en cours est arrêté puis relancé, le délai avant la prochaine exécution est remis à zéro. Exemple : déclencher une opération lorsque l'utilisateur arrête de taper au clavier.
- Quand :
La procédure peut être exécutée :
- immédiatement : la procédure est exécutée dès qu'elle est appelée dans le code.
- avec un démarrage automatique : la procédure est exécutée automatiquement après le code d'initialisation (de la fenêtre, de la page ou du projet).
- en différé : le procédure est exécutée après le délai spécifié.
Si l'exécution est différée, il est possible de conserver ou non cette attente pour les futurs appels de la procédure. - à la fin du traitement contenant l'appel : la procédure est exécutée lorsque le traitement contenant l'appel de la procédure est fini.
- à la fin de l'événement contenant l'appel : la procédure est exécutée lorsque le traitement contenant l'appel de la procédure sera fini. Pour plus de détails, consultez le paragraphe Option "A la fin de l'événement contenant l'appel".
Cas des threads : thread (pour compatibilité) et thread sécurisé Cette option permet de spécifier si la procédure doit s'exécuter en tâche de fond (dans un thread). Thread sécurisé : Lorsqu'un thread est sécurisé : - une erreur de compilation est affichée si les champs sont manipulés dans le thread (ou si la procédure est combinée avec l'attribut "UI").
- une exception est générée :
- lors de l'accès aux champs,
- 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).
Les options sont les suivantes : - Nombre de fois : La procédure peut :
- être exécutée une fois : la procédure s'arrêtera automatiquement après son exécution.
- être exécutée plusieurs fois : la procédure s'exécutera plusieurs fois d'affilé. Dans ce cas, il est possible d'espacer les exécutions de la procédure. Un timer sera donc mis en place automatiquement.
- être exécutée un nombre infini de fois : la procédure s'exécutera un nombre infini de fois. Dans ce cas, il est possible d'espacer les exécutions de la procédure. Un timer sera donc mis en place automatiquement.
- utiliser ou non HFSQL : Cette option permet de spécifier si le thread doit faire des accès à des fichiers de données HFSQL.
Deux types d'accès sont disponibles : - Copie de contexte complète : Permet de copier le contexte des connexions, des positions, des requêtes, ...
- Copie de contexte légère : Permet de copier uniquement le contexte des connexions.
- Quand :
La procédure peut être exécutée :
- immédiatement : la procédure est exécutée dès qu'elle est appelée dans le code et automatiquement après le code d'initialisation (si l'option "Exécution automatique après le code d'initialisation" a été cochée).
- en différé : le procédure est exécutée après le délai spécifié.
Si l'exécution est différée, il est possible de conserver ou non cette attente pour les futurs appels de la procédure. - à la fin du traitement contenant l'appel : la procédure est exécutée lorsque le traitement contenant l'appel de la procédure est fini.
- à la fin de l'événement contenant l'appel : la procédure est exécutée lorsque le traitement contenant l'appel de la procédure sera fini. Pour plus de détails, consultez le paragraphe Option "A la fin de l'événement contenant l'appel".
Cas du thread principal Cette option permet d'appeler une procédure dans le thread principal à partir d'un thread secondaire. Cette option est notamment utilisée pour accéder à l'UI.
Deux cas sont possibles : - Mode synchrone : Le thread secondaire attend la fin de l'exécution de la procédure du thread principal avant de continuer l'exécution. Cette option est équivalente à la fonction ExécuteThreadPrincipal.
- Mode asynchrone : Le thread secondaire n'attend pas la fin de l'exécution de la procédure du thread principal avant de continuer l'exécution. Cette option est équivalente à la fonction ExécuteThreadPrincipalAsynchrone.
Tableau récapitulatif Le tableau suivant permet de visualiser les différents cas d'exécution des procédures selon les options d'automatisme choisies : | | | | | | Appels suivants sans conserver l'espacement ou l'attente | Appels suivants avec conservation de l'espacement ou de l'attente |
---|
Procédure différée (option "Différé" cochée) | 1er appel manuel | Temporisation puis lancement de la procédure | Temporisation puis lancement de la procédure | Appels suivants | Lancement de la procédure | Temporisation puis lancement de la procédure | Procédure différée, répétée avec temporisation (options "Différé", "Infini" et "Espacer les appels" cochées) | 1er appel manuel | Temporisation -> Procédure -> temporisation-> Procédure ... | Temporisation -> Procédure -> temporisation-> Procédure ... | Appel suivants | Lancement de la procédure (une seule fois) | Temporisation -> Procédure -> temporisation-> Procédure ... | Procédure différée, exécutée automatiquement (options "Différé" et "Exécution automatique..." cochées) | 1er appel automatique | Temporisation puis lancement de la procédure | Temporisation puis lancement de la procédure | Appels suivants | Lancement de la procédure | Temporisation puis lancement de la procédure | Procédure différée, exécutée automatiquement, répétée avec temporisation (options "Différé", "Infini", "Espacer les appels" et "Exécution automatique..." cochées) | 1er appel automatique | Temporisation -> Procédure -> temporisation-> Procédure ... | Temporisation -> Procédure -> temporisation-> Procédure ... | Appels suivants | Lancement de la procédure (une seule fois) | Temporisation -> Procédure -> temporisation-> Procédure ... |
Option "A la fin de l'événement contenant l'appel" Les procédures avec l'option "A la fin de l'événement contenant l'appel" appelées depuis une procédure de callback (par exemple procédures utilisées par les fonctions fListeFichier, Evénement, ...) sont exécutées à la fin de chaque appel de la callback. Exemple :
// ----------------- // cas normal // ----------------- Clic de bouton // début du code du clic de bouton Proc1 // début du code de Procédure1 Proc2 // début du code de Procédure2
Appel de Procédure FinEvénément // fin du code de Proc2 // fin du code de Proc1 // fin du code du clic de bouton Exécution de Procédure FinEvénément // ------------------- // cas callback // ------------------- Clic de bouton Proc1 Proc2 utilisation de la fonction fListeFichier Procédure Callback1 // début du code de Procédure Callback1 ProcCallback2 // début du code de Procédure Callback2 Appel de ProcFinEvénément // fin du code de ProcédureCallback2 // fin du code de ProcédureCallback1 Exécution de ProcFinEvénément ProcédureCallback1 // début du code de ProcédureCallback1 ProcédureCallback2 // début du code de ProcédureCallback2 Appel de ProcFinEvénément // fin du code de ProcédureCallback2 // fin du code de ProcédureCallback1 Exécution de ProcFinEvénément Arrêter une procédure automatique Pour arrêter une procédure automatique, il suffit d'utiliser la fonction FinAutomatismeProcédure. Procédure avec lancement automatique de threads Rappel : En WLangage, par défaut, chaque procédure fait une section critique automatique. Deux threads ne peuvent donc pas exécuter en même temps la même procédure. Si une procédure qui déclenche automatiquement un thread est appelée deux fois : - en mode par défaut : la première procédure se lance et la seconde procédure attend que la première ait fini pour se lancer.
- en mode threadSectionCritique (défini avec la fonction ThreadMode), les deux threads se déclenchent en même temps.
Programmation Orientée Objet (POO) Lorsqu'un automatisme de procédure est défini sur une méthode de classe pour une exécution infinie par timer, un seul appel pour toutes les instances pourra être fait : - si l'automatisme de la méthode est configuré avec "Faire uniquement l'appel" : seule une des instances de la classe fera l'appel de la méthode via le timer.
- si l'automatisme de la méthode est configuré avec "Lancer un timer supplémentaire" : toutes les instances de la classe feront un appel de la méthode pour l'instance en cours.
Si l'automatisme est configuré pour une exécution infinie dans un thread, toutes les instances de la classe feront un appel de la méthode pour l'instance en cours.
Liste des exemples associés :
|
Exemples unitaires (WINDEV) : Les fonctions Chrono
[ + ] Utilisation des fonctions ChronoXXX. Ces fonctions permettent de calculer le temps écoulé entre le début (Fonction ChronoDébut) et la fin (Fonction ChronoFin)
|
|
Exemples didactiques (WINDEV) : WD Ecran de veille
[ + ] Cet exemple illustre la réalisation d'un économiseur d'écran avec les fonctions WLangage. Dans cet exemple, nous abordons les principaux thèmes suivants : 1/ l'appel périodique d'une procédure (les "timers") 2/ la gestion des événements Windows 3/ les fonctions système (appel d'API Windows) Pour utiliser l'écran de veille : - Renommer l'exécutable (.EXE) en .SCR - Copier le fichier dans le répertoire de Windows (Ex: C:\WINDOWS) - Ouvrir la fenêtre de propriétés d'affichage du bureau - Choisir l'onglet "Ecran de Veille" - Sélectionnez l'écran de veille généré avec WINDEV
|
|
Exemples didactiques (WINDEV) : WD Qui bloque
[ + ] Cet exemple montre comment signaler aux utilisateurs d'une base de données HFSQL en réseau "qui" bloque un enregistrement inaccessible. Dans cet exemple, nous abordons les principaux thèmes suivants : 1/ la gestion des accès concurrentiels 2/ le rafraîchissement automatique par timer 3/ la gestion d'un fichier "système" pour mémoriser des informations sur les verrous posés. Résumé de l'exemple livré avec WINDEV : Cet exemple réalisé avec WINDEV est composé de 2 projets : - WD Qui bloque : application de test gérant un fichier "client" en réseau - WD Superviseur blocages : outil d'aministration pour visualiser les verrous posés et éventuellement forcer un déblocage. Un utilisateur peut avoir conservé une fiche de saisie ouverte depuis un certain temps ; ce qui risque de gêner les autres utilisateurs. Le bouton 'Libérez SVP' permet d'envoyer un message à l'utilisateur concerné pour lui demander de libérer l'enregistrement. Le bouton 'Débloquer !' permet de forcer le déblocage de l'enregistrement. Attention : Cette opération va envoyer un message forçant la fermeture de l'application ayant effectué le blocage.
|
|
Exemples unitaires (WEBDEV) : Gestion des timers
[ + ] Mise en place d'un timer : - Démarrage d'un timer - Exécution d'un code à chaque appel du timer - Arrêt d'un timer
|
|
Exemples unitaires (WINDEV Mobile) : Gestion des timers
[ + ] Mise en place d'un timer : - démarrer un timer - exécuter un code à chaque appel du timer - arrêter un timer
|
|
Exemples unitaires (WINDEV) : Les alarmes
[ + ] Mise en place d'une alarme pour afficher un message d'alerte dans la barre de titre de la fenêtre active (quelle que soit l'application). Nous abordons les principaux thèmes suivants : 1/ Les fonctions système (récupération du handle d'une fenêtre) 2/ Le déclenchement d'un traitement selon une fréquence donnée (les timers)
|
|
Exemples unitaires (WINDEV Mobile) : Les fonctions Chrono
[ + ] Utilisation des fonctions WLangage "Chrono". Ces fonctions permettent de calculer le temps écoulé entre le début (Fonction ChronoDébut) et la fin (Fonction ChronoFin)
|
Documentation également disponible pour…
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|