DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / Editeurs / Editeur de code
  • 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)
  • Limitation WEBDEV
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac CatalystUniversal Windows 10 App
Autres
Procédures stockées
Présentation
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.
WEBDEV - Code Serveur Ce mécanisme permet également d'exécuter des tâches planifiées et des tâches différées sur le Serveur d'Application WEBDEV. Pour plus de détails, consultez Tâches planifiées et tâches différées.
Comment le faire ?

Automatiser une procédure

Pour automatiser une procédure :
  1. Affichez le code de la procédure.
  2. Affichez la fenêtre de description des automatismes de la procédure :
    • Cliquez sur l'icône 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".
  3. 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 :
    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 :
    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".
WEBDEV - Code Serveur Remarque : En WEBDEV, les timers ne sont pas disponibles. Les automatismes de répétition et d'exécution différée ne sont pas disponibles. L'utilisation d'une procédure automatique répétée est tout de même configurable car une collection de procédures, une classe, ... peut être partagée entre plusieurs produits.

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 :
    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 :
    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.
Remarques

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'attenteAppels suivants avec conservation de l'espacement ou de l'attente
Procédure différée (option "Différé" cochée)1er appel manuelTemporisation puis lancement de la procédureTemporisation puis lancement de la procédure
Appels suivantsLancement de la procédureTemporisation 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 manuelTemporisation -> Procédure -> temporisation-> Procédure ...Temporisation -> Procédure -> temporisation-> Procédure ...
Appel suivantsLancement 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 automatiqueTemporisation puis lancement de la procédureTemporisation puis lancement de la procédure
Appels suivantsLancement de la procédureTemporisation 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 automatiqueTemporisation -> Procédure -> temporisation-> Procédure ...Temporisation -> Procédure -> temporisation-> Procédure ...
Appels suivantsLancement 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.
WEBDEV - Code Serveur

Limitation WEBDEV

En WEBDEV, les timers ne sont pas disponibles. Les automatismes de répétition et d'exécution différée ne sont pas disponibles.
Remarque : L'utilisation d'une procédure automatique répétée est tout de même configurable car une collection de procédures (ou une classe, ...) peut être partagée entre plusieurs produits.
Liste des exemples associés :
Les fonctions Chrono 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)
WD Ecran de veille 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
WD Qui bloque 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.
Gestion des timers 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
Gestion des timers 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
Les alarmes 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)
Les fonctions Chrono 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)
Version minimum requise
  • Version 10
Documentation également disponible pour…
Commentaires
Abandonnez pas TimerSYS
Juste pour vous signaler que votre système de procédure automatique est vraiment agréable mais cependant il a un inconvénient important. On doit déterminer la durée lors de la programmation et ne pourra plus être modifiée par la suite à moins de ré-ouvrir le programme, le changer dans l'éditeur et compiler à nouveau.
Jean-Pierre
08 mar. 2020

Dernière modification : 20/02/2023

Signaler une erreur ou faire une suggestion | Aide en ligne locale