timer funktioniert nicht
-
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.
-
Hat mit einer Resourcenid überhaupt nichts zu tun. Ein Time muss nur eindeutig für dieses Programm sein.
1. Parameter SetTimer ist ein int und da kann man einsetzen was man will solange man unter ca. 65000 bleibt. 65xxx ist die max Anzahl Timer.Zu dem Problem. Vermutlich wird der Timer nicht an dein Fenster weitergereicht. Du könntest mal dein Project Online stellen.
-
Wie sieht es aus?
ResourcenD ist wirklich nicht nötig, die Zahl muß nur eindeutig für das Fenster sein