Pourquoi ça ne fonctionne pas, ça ???

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Pourquoi ça ne fonctionne pas, ça ???

Message par Chris »

Bon, pour trouver plus débile, va falloir se lever tôt. :lol:

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 :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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 
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 !! :)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Oui, mais tu n'as pas besoin de la procédure TimerProc() dans ce cas. :wink:

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 :wink:

Chris :)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message 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 !
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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 :lol: :wink:

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 :)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

et si tu rends invisible la fenetre ?
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message 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 !
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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 :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

C'est exactement ce que j'ai posté, bravo pour la recopie. :mrgreen:

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
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

T'as compris pourquoi Régis à plus de post que tout le monde???

C'est le roi du Copier/Coller :lol:

Chris :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je me disais aussi qu'y avait un truc pas normal :lol:
Répondre