Win32Timer

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Win32Timer

Message par Droopy »

Gestion de timers via l'Api Win32 sans Callback

Code : Tout sélectionner

;/ Author: BackupUser tweaked by Droopy

OpenWindow(0,0,0,230,120,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Timer with API") 
CreateGadgetList(WindowID(0))
TextGadget(0,10,10,210,30,"")
TextGadget(1,10,45,210,30,"")
TextGadget(2,10,80,210,30,"Timer 1 and 2 Started",#PB_Text_Center)

;/ Starting Timers
SetTimer_(WindowID(),1,150,0)   ; Timer #1 each 150 ms
SetTimer_(WindowID(),2,1000,0)  ; Timer #2 each 1 second
SetTimer_(WindowID(),3,10000,0) ; Timer #3 each 10 seconds
  
Repeat
  Event = WaitWindowEvent()
  If Event=#WM_TIMER
    
    Select EventwParam()
      
      Case 1 ;/ Timer #1
        SetGadgetText(0,GetGadgetText(0)+"-")
        Beep_(400,10)
        
      Case 2 ;/ Timer #2
        SetGadgetText(1,GetGadgetText(1)+"###")
        Beep_(800,10)
        
      Case 3 ;/ Timer #3
        SetGadgetText(2,"Timer 1 and 2 Stopped")
        KillTimer_(WindowID(),1) ;/ Kill Timer #1
        KillTimer_(WindowID(),2) ;/ Kill Timer #2
        Beep_(1500,500)
        
     EndSelect
  EndIf
Until Event=#PB_EventCloseWindow
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Cool ça, je vais tester... :D
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

nouvelle version

Code : Tout sélectionner

;/ Author: BackupUser tweaked by Droopy/Kale 

ProcedureDLL TimerStart(TimerId,Delay,ProcedureAdress) 
  SetTimer_(WindowID(),TimerId,Delay,ProcedureAdress) 
EndProcedure 

ProcedureDLL TimerKill(TimerId) 
  KillTimer_(WindowID(),TimerId) 
EndProcedure 

;/ Test 

Procedure Timer1() ; First ProgressBarGadget 
  SetGadgetState(0,GetGadgetState(0)+1) 
  Beep_(400,10) 
EndProcedure 

Procedure Timer2(); Second ProgressBarGadget 
  SetGadgetState(1,GetGadgetState(1)+1) 
  Beep_(1000,10) 
EndProcedure 

Procedure Timer3() 
  SetGadgetText(2,"Timer 3 Kill Timer 1 and 2") 
  TimerKill(1) ;/ Kill Timer #1 
  TimerKill(2) ;/ Kill Timer #2 
  Beep_(1500,500) 
EndProcedure 

OpenWindow(0,0,0,230,120,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Timers with API") 
CreateGadgetList(WindowID()) 
ProgressBarGadget(0,10,10,210,30,0,65,#PB_ProgressBar_Smooth) 
ProgressBarGadget(1,10,45,210,30,0,9,#PB_ProgressBar_Smooth) 
SetGadgetState(0,0) 
SetGadgetState(1,0) 
TextGadget(2,10,80,210,30,"Timer 1/2/3 Started",#PB_Text_Center) 

;/ Starting Timers 
TimerStart(1, 150, @Timer1())   ; Timer #1 each 150 ms 
TimerStart(2, 1000, @Timer2())  ; Timer #2 each 1 second 
TimerStart(3, 10000, @Timer3()) ; Timer #3 each 10 seconds 
  
Repeat 
Until WaitWindowEvent()=#PB_EventCloseWindow 
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

C'est "ThreadSafe" ou pas ???
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Je ne pense pas
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Pas mal comme effet.
J'ai dû changer le nom de la procédure DLL TimerKill() par TimerKiller() pour que cela fonctionne. Non reconnu comme nom sinon.

Ce qui serait intéressant c'est de pouvoir l'utiliser durant une application en arrière plan, comme une fenêtre d'attente par exemple.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Jacobus a écrit :Pas mal comme effet.
J'ai dû changer le nom de la procédure DLL TimerKill() par TimerKiller() pour que cela fonctionne. Non reconnu comme nom sinon.
Je pense remplacer la fonction Timer / TimerKill de la Droopy Lib par celle-ci, comme ça il n'y aura plus de pb de nom de procédures identiques 8)

Et en plus la nouvelle fonction est bien plus puissante :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

le premier code que tu as posté est connu depuis super longtemps

moi j'avais cette exemple , que j'ai deja posté plein de fois sur ce forum

Code : Tout sélectionner

 Procedure TimerProc(hWnd.l, uMsg.l, idEvent.l, dwTime.l)
    Select uMsg
        Case #WM_TIMER
            Select idEvent
                Case 1
                    Debug "--------------------1 seconde"
                    ; Ici, le code à executer toutes les secondes
                Case 2
                    Debug "0.2 secondes"
                    ; Ici, le code à executer toutes les 200 millisecondes
                Case 3
                    Debug "-------------------------------------------3 secondes"
                    ; Ici, le code à executer toutes les 3 secondes
            EndSelect
    EndSelect
EndProcedure


If OpenWindow(0, 100, 100, 100, 100, #PB_Window_SystemMenu, "")
    Handle = WindowID(0)
    
    SetTimer_(Handle, 1, 1000, @TimerProc()) ; envoie un evenement toutes les 1000 millisecondes
    SetTimer_(Handle, 2, 200, @TimerProc())  ; envoie un evenement toutes les 200 millisecondes
    SetTimer_(Handle, 3, 3000, @TimerProc())  ; envoie un evenement toutes les 3000 millisecondes
    
    Repeat
    Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf 
je sais plus ou j'avais recuperé ça , mais ça fait bien 2 ans ! (peut etre plus ! ) :D
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

Dobro a écrit :le premier code que tu as posté est connu depuis super longtemps
Effectivement c'est un très vieux code restauré de l'ancien forum par BackupUser, et il m'a permis de mieux comprendre l'API Win32 :wink:

Voici le lien : http://forums.purebasic.com/english/vie ... ht=wmtimer
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

On est nombreux à connaitre les timers surtout qu'il y a eu une grande discussion dessus justement ici:

http://purebasic.hmt-forum.com/viewtopi ... 7a8a84e21a


Mais c'est bien de temps en temps de remettre en avant certains sujets ne serait ce que pour les nouveaux.
Répondre