timer funktioniert nicht
-
Hallo,
probier mal die MessageBox nach SetTimer herrauszunehmen, möglicherweise ist der Dialog für WM_TIMER blockiert.
Gruss moskito
-
jo
das wär mein nächster Tip gewesen!
Timer und Afx´s mögen sich nicht so gerne, aber warum das so ist ...
kann uns ja hoffentlich jemand erklären ...sven
-
hmm ne auch am brakepoint hält der net an ..
-
Hallo,
habe das selbe Problem:
void COpenGLPane::OnInitialUpdate() { CView::OnInitialUpdate(); SetTimer(1,300,NULL); } . . . void COpenGLPane::OnTimer(UINT nIDEvent) { CSDIFrameDoc* pDoc = GetDocument(); actualTime++; CView::OnTimer(nIDEvent); }
actualTime wird aber nicht inkrementiert!?!?!
Jemand ne Idee???
-
OnTimer ist auch in der Message Map drin, und dein Programm ist "Idle" (i.e. der Main Thread verarbeitet Nutzereingaben)?
Wenn ja: Spy++, dein OpenGL-Fenster, den Filter auf WM_TIMER stellen, und mal nachgucken, ob das Fenster eine WM_TIMER-message bekommt.
-
Nein, bekommt es nicht!
So tief bin ich in die Materie auch noch nicht eingestiegen: Wie regel ich denn das mit der Message Map? Habe mich immer auf das Visual Studio verlassen
Habe aber im Code folgendes entdeckt - vielleicht kann jamnd damit was anfangen:
// Generierte Nachrichtenzuordnungsfunktionen protected: //{{AFX_MSG(COpenGLPane) afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg BOOL OnEraseBkgnd(CDC* pDC); afx_msg void OnCancelMode(); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt); afx_msg void OnRButtonUp(UINT nFlags, CPoint point); afx_msg void OnRButtonDown(UINT nFlags, CPoint point); afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnTimer(UINT nIDEvent); afx_msg void OnDestroy(); //}}AFX_MSG DECLARE_MESSAGE_MAP()
-
Außerdem:
BEGIN_MESSAGE_MAP(COpenGLPane, CView) //{{AFX_MSG_MAP(COpenGLPane) ON_WM_SIZE() ON_WM_ERASEBKGND() ON_WM_CANCELMODE() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() ON_WM_MOUSEWHEEL() ON_WM_RBUTTONUP() ON_WM_RBUTTONDOWN() ON_WM_CREATE() ON_WM_TIMER() ON_WM_DESTROY() //}}AFX_MSG_MAP END_MESSAGE_MAP()
Scheint doch alles drin zu sein, oder?
-
yup, das erste Teil deklariert die OnTimer-Funktion (mit der richtigen Aufrufkonvention), die Message Map sagt, das bei der Windows Message WM_TIMER deine Funktion OnTimer aufgerufen werden soll.
Wenn du noch Probleme mit dem Spy hast (wirklich ein Supertool für solche Fragen), dann mach folgendes: Erstell eine Dialogbasierte MFC-Anwendung mit dem Wizard, und füge dort einen ähnlichen Timer direkt im Hauptdialog ein. Mit so einer "Sandbox" kann man die Unterschiede einkreisen.
-
debug doch mal und schau was er macht...
-
hmm bei mir fehlen diese einträge vollständig ..
wie verknüpfe ich denn die message ON_WM_TIMER mit der Funktion OnTimer() ?
-
[edit]
Der Class Wizard kann diese einträge erstellen. (siehe MSDN,MFC tutorials)oder:
Funktion deklarieren wie oben
ON_WM_TIMER() in die Message-Map eintragen
-
kannst auch einfach auf deine Klasse klicken (rechte Maustaste) und dann MessageHandler auswählen
-
Sooo...
also, Spy++ liefert mir für den OpenGLPane einen Haufen WM_ONPAINT und WM_MOUSEMOVE, aber keinen einzigen ON_TIMER
Wenn ich debugge, und in der OnTimer() einen Haltepunkt setze, springt er da auch nie rein.
Wie kann das? Ist mein Timer kaputt?
-
super es hat endlich geklappt !
es fehlten tatsächlich noch die message map einträge ....
naja mit dem tip von timo hats dann geklappt !!THX noch mal !!
Ulath
-
Bei mir klappt's leider nach wie vor nicht
-
Hängt es vielleicht damit zusammen, daß ich mit zwei Frames arbeite? Das Animations-Frame habe ich von CView abgeleitet - eigentlich müßte das doch laufen...
-
SetTimer(1,300,NULL);
-> versuch da mal statt der 1 ne resourcen id einzufügen !
geht unter ressourcen -> rechte maustaste auf project ressourcen -> ressourcensymbole
da ID_TIMER am besten nen eindeutigen wert zuweisen ..
SetTimer(ID_TIMER,300,NULL);
-
int m_nTimer = SetTimer(IDC_ANIMTIMER, 20, 0);
So, habe den Timeraufruf mal modifiziert. Der Timer wird korrekt aufgerufen (m_nTimer hat nach Aufruf den Wert 1), und IDC_ANIMTIMER ist auch nur eine int-Variable (hat bei mir den Wert 101)
Läuft trotzdem nicht. Ich bekomme unter Spy++ auch keine Timer-Message, und beim Debuggen springt er auch nicht in die OnTimer()-Funktion
-
Hmpff!
Weiß keiner weiter? Ist doch gar nicht so ungewöhnlich, was ich hier versuche!
-
Bei uns geht es ja auch
Checkliste:
- SetTimer wird aufgerufen
- KillTimer wird nicht aufgerufen
- Die Message Map enthält ON_WM_TIMER
- SetTimer, OnTimer und ON_WM_TIMER befinden sich im gleichen Fenster
- Das Fenster wird nicht zerstört, bevor die WM_TIMER - Message ankommt
- Das Fenster verarbeitet andere Messages problemlos
Wenn das alles OK ist, dann probier es mal mit einer Minimalanwendung wie oben erwähnt.