Page 1 sur 1

Win32Timer

Publié : dim. 06/nov./2005 20:46
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

Publié : lun. 07/nov./2005 9:56
par lionel_om
Cool ça, je vais tester... :D

Publié : lun. 07/nov./2005 11:45
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 

Publié : lun. 07/nov./2005 13:34
par lionel_om
C'est "ThreadSafe" ou pas ???

Publié : lun. 07/nov./2005 14:12
par Droopy
Je ne pense pas

Publié : lun. 07/nov./2005 19:40
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.

Publié : lun. 07/nov./2005 20:01
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:

Publié : lun. 07/nov./2005 22:32
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

Publié : lun. 07/nov./2005 22:42
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

Publié : mar. 08/nov./2005 17:55
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.