Timer + OpenGL

Signaler
Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
-
Maegis
Messages postés
101
Date d'inscription
vendredi 15 février 2002
Statut
Membre
Dernière intervention
6 août 2007
-
Bonjour,
je possede un environnement MDI, qui contient une fenetre mere et deux filles (l'une des filles est en OpenGL)
J'ai mis un Timer dans la fenetre mère :

WM_CREATE:
SetTimer(hwnd, 1, 3000, NULL);
WM_TIMER
MessageBox(NULL, "iop", "iop", NULL);
WM_CLOSE:
KillTimer(hwnd, 1);

Lorsque je lance le programme, seule la fenetre mere se lance. Je reçois alors bien les MessageBox qui me montrent que le Timer marche. Je lance alors la fenetre fille qui n'a pas d'openGL, le Timer marche encore. Je lance ensuite celle qui contient l'OpenGL, le timer marche plus !!!

L'openGL bloquerait-il les messages WM_TIMER de la fenetre mere ??? Comment puis-je faire un timer alors ??

Glipper

ps : j'ai aussi essayé de faire un SetTimer(NULL, NULL, 3000, &procedure) dans le WinMain, mais il y a le même probleme.

7 réponses

Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007

pour ton timer avec fonction callback, tu ne dois pas mettre le & devant, car le nom d'une fonction represente deja son adresse
Messages postés
101
Date d'inscription
vendredi 15 février 2002
Statut
Membre
Dernière intervention
6 août 2007

Et ben , j'ai le meme probleme, j'utilise openGL et un timer et je ne recois aqucun message de timer, si je vire le code openGL je recois les messages de timer
Est ce que tu a reussi a ressoudre ton probleme ? Ca me serait bien utile
Messages postés
246
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
11 septembre 2016
1
Je n'ai pas reglé le probleme, mais j'ai cette petite astuce, ce qui en revient à peu pres au même qu'un timer en fait :

dans la boucle à la fin du WinMain, j'ai rajouté une fonction que j'ai appelé Refresh() :

...
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
ReFresh();
...

et dans cette fonction, je recree une sorte de timer à l'aide de l'heure : (la fonction timeGetTime renvoi l'heure en ms....)

void ReFresh()
{
static unsigned int TimeStart = timeGetTime(),TimeStop;
TimeStop = timeGetTime();

if (TimeStop - TimeStart > 1000)
{
....
instructions toute les 1000ms
....

TimeStart = TimeStop;
}

Voila voila, en esperant que ça pourra t'aider :)
Glipper
Messages postés
101
Date d'inscription
vendredi 15 février 2002
Statut
Membre
Dernière intervention
6 août 2007

Ouais je crois que je vais faire la meme chose.
Merci
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007

sinon avec la methode d'avant, essaye de placer ton SetTimer dans l'evenement WM_INITDIALOG et ton KillTimer dans WM_QUIT

je suis pas sure du tout, j'utilise toujours les Timer comme tu le fait dans la seconde methode, mais c'est toujours bon d'essayer autre chose pour voir si ca fonctionne

si tu essaye et que ca fonction, merci pour le feedback ;)
Messages postés
140
Date d'inscription
mercredi 3 juillet 2002
Statut
Membre
Dernière intervention
19 novembre 2006

Moi je fais pointé mon timer sur une fonction de type Timer
je vous montre mon exemple que j'utilise pour mon doom like

/* Fonctions appelées par des timers

  Auteur : Krust

  Date : 18 02 04

*/
UINT uResult;

void CALLBACK Moves(HWND,UINT,UINT,DWORD);
void CALLBACK GetFPS(HWND,UINT,UINT,DWORD);

void CreatTimers(void){
uResult = SetTimer(hWnd,(int)1,10,(TIMERPROC) Moves);
uResult = SetTimer(hWnd,(int)2,1000,(TIMERPROC) GetFPS);
}

VOID CALLBACK Moves( 
    HWND hwnd,        // handle to window for timer messages 
    UINT message,     // WM_TIMER message 
    UINT idTimer,     // timer identifier 
    DWORD dwTime)     // current system time 
{ 

// Actions keyboard

if(keys[VK_UP]) SetPosition(1);
if(keys[VK_DOWN]) SetPosition(0);
if(keys[VK_LEFT]) SetPosition(3);
if(keys[VK_RIGHT]) SetPosition(2);

// Actions Mouse

GetCursorPos(&mousePos);
SetViewMouse(mousePos,MouseRef);
SetCursorPos(MouseRef.x,MouseRef.y);
 
}

VOID CALLBACK GetFPS( 
    HWND hwnd,        // handle to window for timer messages 
    UINT message,     // WM_TIMER message 
    UINT idTimer,     // timer identifier 
    DWORD dwTime)     // current system time 
{ 
FPS2=FPS;
FPS=0;
}



J4ai trouvé le skellette des fonction sur msdn et j'ai facilement réussi à les adapter.
je trouve ça quand même plus pratique.
====================================

KRUST
Messages postés
101
Date d'inscription
vendredi 15 février 2002
Statut
Membre
Dernière intervention
6 août 2007

Oui mais dans mon cas je ne peut pas faire [...]