Execution d'une routine à intervalle régulier

Programmation d'applications complexes
ProVideo
Messages : 3
Inscription : sam. 05/nov./2022 10:37

Execution d'une routine à intervalle régulier

Message par ProVideo »

Le très ancien Quick Basic compilé de Microsoft avait une instruction très utile qui permet d'interrompre un programme en cour d'exécution à des intervalles réguliers afin d'exécuter une sous routine ou une procedure. Voici un exemple simple d'utilisation (en supposant que votre PC soit très lent et mette un temps considérable pour effectuer la boucle For Next):

On Timer(1000) gosub MaRoutine ;1000 est le nombre de millisecondes

For i=0 to 100
if i<=50 then TimerON else TimerOFF: Endif ;Le timer est activé si i<=50 sinon il est désactivé
Print i
Next
End

MaRoutine: Beep: Return

Un beep sera émis toutes les 1 secondes si le le PC est occupé d'afficher un nombre entre 0 et 50 et il n'y aura pas de beep pendant l'affichage des
nombres entre 50 et 100

L'instruction On Timer est très puissante. Elle permet par exemple dans un programme d'alarme de retourner à intervalle régulier l'état des détecteurs au programme principal qui prendra alors la décision qui s'impose. Autre exemple: faire clignoter automatiquement à intervalle régulier des instructions à l'écran, les possibilités sont infinies.

Je n'ai pas trouvé une manière aussi simple d'implémenter cela en QB.
Avatar de l’utilisateur
SPH
Messages : 4946
Inscription : mer. 09/nov./2005 9:53

Re: Execution d'une routine à intervalle régulier

Message par SPH »

ProVideo a écrit : sam. 05/nov./2022 11:54 Je n'ai pas trouvé une manière aussi simple d'implémenter cela en QB.
... en PB tu veux dire !

Voilà l'équivalence (parmi de nombreuses façon de faire) :

Code : Tout sélectionner

timer=ElapsedMilliseconds()

For i=0 To 1000
  
  If ElapsedMilliseconds()-timer>=50
    TimerOn=1
  Else
    TimerOn=0
  EndIf
  Debug TimerOn
Next


!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Execution d'une routine à intervalle régulier

Message par falsam »

Peut être AddWindowTimer(#Fenetre, Minuteur, Temps) ? :mrgreen:

https://www.purebasic.com/french/docume ... timer.html
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Execution d'une routine à intervalle régulier

Message par falsam »

Un petit exemple pour illustrer la fonction AddWindowTimer() associé à la fonction BindEvent() pour l'initialiser.

:arrow: Bindevent() est une façon moderne de gérer les evenements d'une application.

Ce code afficher une fenêtre et lance un timer de 1000ms associé à une procédure que j'ai appelé OnTImer()

Code : Tout sélectionner

EnableExplicit

Enumeration window
  #mf
EndEnumeration

Enumeration Gadget
  #mfTimer
EndEnumeration

Enumeration misc
  #timer
EndEnumeration

Enumeration gadget
  #mfResult
EndEnumeration

;Sommaire
Declare Start()
Declare OnTimer()
Declare Exit()

Start()

Procedure Start()
  OpenWindow(#mf, 0, 0, 400, 100, "Gestion d'un timer", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  TextGadget(#PB_Any, 20, 20, 100, 24, "Timer")
  StringGadget(#mfResult, 120, 20, 100, 24, "", #PB_String_ReadOnly)
  
  ; Ajoutons un timer de 1000ms à la fenetre #mf
  AddWindowTimer(#mf, #timer, 1000)
  
  ; Déclencheur fermeture de la fenetre
  BindEvent(#PB_Event_CloseWindow, @Exit())
  
  ; Déclencheur timer 
  BindEvent(#PB_Event_Timer, @OnTimer())
  
  ; Loop
  Repeat : WaitWindowEvent(1000) : ForEver   
EndProcedure

Procedure OnTimer()
  Static Count
  Count + 1
  SetGadgetText(#mfResult,  "Passage " + count)
EndProcedure

Procedure Exit()
  End
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre