Page 1 sur 1
Pourquoi ça ne fonctionne pas, ça ???
Publié : mer. 19/mai/2004 11:20
par Chris
Bon, pour trouver plus débile, va falloir se lever tôt.
Code : Tout sélectionner
Procedure TimerProc(hwnd, uMsg, idEvent, dwTime)
Debug "Coucou!!!"
EndProcedure
SetTimer_(#Null,1,2000,@TimerProc())
Je devrais au moins avoir un affichage du debug à l'intérieur de la procédure.
Quelqu'un sait-il comment utiliser un Timer sans avoir de fenêtre???
Chris

Publié : mer. 19/mai/2004 11:47
par nico
Apparemment, pour utiliser la fonction settimer, il faut créer une fenêtre car sans boucle de réception des messages, la fonction ne travaille pas.
Code : Tout sélectionner
Global Quit
Procedure TimerProc(hwnd, uMsg, idEvent, dwTime)
Debug "Coucou!!!"
Quit=Quit+1
EndProcedure
Enumeration
#Window
EndEnumeration
If OpenWindow(#Window,0,0,400,400,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Pure Basic")
SetTimer_(0,1,1000,@TimerProc())
Repeat
EventID.l=WaitWindowEvent()
; Select EventID
; Case #WM_TIMER
; Debug "Timer"
; EndSelect
Until Quit=10
EndIf
Publié : mer. 19/mai/2004 11:57
par Backup
oui c'est embetant , surtout qu'il est specifié dans la doc des API windows
que l'on peut se passer de fenetre en donnant un #null
Fred , reviens tout de suite !!

Publié : mer. 19/mai/2004 11:59
par Chris
Oui, mais tu n'as pas besoin de la procédure TimerProc() dans ce cas.
Tu peux aussi bien récuperer ton #WM_TIMER dans la boucle, et executer la code à la fin de chaque Time-Out.
Si on a un appel prévu sur une callback, ça doit servir à quelque chose.
PS : C'était la réponse à Nico
Chris

Publié : mer. 19/mai/2004 13:53
par Le Soldat Inconnu
euh, comme çà, ça marche mais il faut quand même une fenêtre
Code : Tout sélectionner
Procedure TimerProc()
Debug "Coucou!!!"
EndProcedure
Enumeration
#Window
EndEnumeration
If OpenWindow(#Window, 0, 0, 400, 400, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Pure Basic")
SetTimer_(0, 0, 1000, @TimerProc())
Repeat
EventID.l = WaitWindowEvent()
Until EventID = #WM_CLOSE
EndIf
Publié : mer. 19/mai/2004 13:58
par fweil
...,
Moi je ferai comme ça pour ne pas être tributaire d'une fenêtre :
Code : Tout sélectionner
Procedure TimerProc(Intervalle_de_temps.l)
Chronometre = ElapsedMilliseconds()
Repeat
If ElapsedMilliseconds() - Chronometre => Intervalle_de_temps
Chronometre = ElapsedMilliseconds()
Debug "Coucou " + Str(ElapsedMilliseconds())
Sleep_(1)
EndIf
Sleep_(1)
ForEver
EndProcedure
;
;
;
Numero_Thread = CreateThread(@TimerProc(), 2000)
Repeat
ForEver
End
Comme ça on est pas dépendant de l'API non plus !
Publié : mer. 19/mai/2004 15:09
par Chris
@Regis
Ben oui, ça, je connais, mais le but, c'est de ne pas avoir de fenêtre.
Si tu fais ça:
Code : Tout sélectionner
Procedure TimerProc()
Debug "Coucou!!!"
EndProcedure
Enumeration
#Window
EndEnumeration
SetTimer_(0, 0, 1000, @TimerProc())
If OpenWindow(#Window, 0, 0, 400, 400, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Pure Basic")
Repeat : Until WaitWindowEvent() = #WM_CLOSE
EndIf
ca fonctionne aussi, même si le timer n'est plus dans la boucle, mais il y a pourtant la fenêtre!
@fweil
Et si j'achète une montre, je ne suis plus dépendant non plus de Pure Basic
Sérieusement, c'est ton code qui se rapproche le plus de ce que je cherches, mais ça ne me dit pas si on peut utiliser un timer sans utiliser de fenêtre.
Parce que le truc, c'est qu'un timer retourne aussi des messages, Id du timer, par exemple.
Et la procedure TimerProc existe bien dans le SDK.
The TimerProc function is an application-defined callback function that processes WM_TIMER messages.
VOID CALLBACK TimerProc( HWND hwnd,
UINT uMsg,
UINT_PTR idEvent,
DWORD dwTime
);
Parameters
hwnd
[in] Handle to the window associated with the timer.
uMsg
[in] Specifies the WM_TIMER message.
idEvent
[in] Specifies the timer's identifier.
dwTime
[in] Specifies the number of milliseconds that have elapsed since the system was started. This is the value returned by the GetTickCount function.
Chris

Publié : mer. 19/mai/2004 15:58
par Le Soldat Inconnu
et si tu rends invisible la fenetre ?
Publié : mer. 19/mai/2004 17:41
par fweil
Comme ça effectivement c'est + rationnel :
Code : Tout sélectionner
#Button_Minimize = 1
#Etat_Fenetre = #SW_HIDE
; #Etat_Fenetre = #SW_MINIMIZE
Procedure TimerProc(hwnd, uMsg, idEvent, dwTime)
SetWindowText_(hWnd, "Chronomètre caché : Coucou à " + FormatDate("%hh:%ii:%ss", Date()))
EndProcedure
;
;
;
If OpenWindow(0, 0, 0, 320, 240, #PB_Window_Invisible, "Chronomètre caché")
ShowWindow_(WindowID(), #Etat_Fenetre)
SetTimer_(WindowID(), 1, 2000, @TimerProc())
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
End
Je suggère d'utiliser MINIMIZE plutôt que HIDE parce que sinon la fen^tre est plutôt crampon à tuer. Mais elle peut être HIDE et être tuée par un autre prog qui connaît son ID ou par la mimine du codeur ... dans le gestionnaire de tâches.
Enfin bon, quoi !
Publié : mer. 19/mai/2004 17:50
par Chris
Ouais, finalement c'est peut-être tout simplement ça, la solution.
Mais à moins de me tromper, je préfères une fenêtre "Hide", plutôt que "Minimized", car elle n'apparaît pas dans la barre de tâches. (En utilisant la fonction HideWindow() de Pure, ça fonctionne sans problème.)
C'est d'ailleurs sur ce principe que fonctionnent ClearScreen, Mini-Shot-Ftp, et je ne sais plus lequel qui ne me sers plus depuis un moment.
Chris

Publié : mer. 19/mai/2004 18:31
par nico
C'est exactement ce que j'ai posté, bravo pour la recopie.
Le Soldat Inconnu a écrit :euh, comme çà, ça marche mais il faut quand même une fenêtre
Code : Tout sélectionner
Procedure TimerProc()
Debug "Coucou!!!"
EndProcedure
Enumeration
#Window
EndEnumeration
If OpenWindow(#Window, 0, 0, 400, 400, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Pure Basic")
SetTimer_(0, 0, 1000, @TimerProc())
Repeat
EventID.l = WaitWindowEvent()
Until EventID = #WM_CLOSE
EndIf
Publié : mer. 19/mai/2004 18:33
par Chris
T'as compris pourquoi Régis à plus de post que tout le monde???
C'est le roi du Copier/Coller
Chris

Publié : mer. 19/mai/2004 18:42
par nico
Je me disais aussi qu'y avait un truc pas normal
