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

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
Et en plus la nouvelle fonction est bien plus puissante

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 ! )

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