timer funktioniert nicht
-
HI
ich habe den timer folgendermaßen programmiert:
void CFLBDlg::DoRatingLoop() { SetTimer(ID_TIMER, 2000, NULL); // Timer wird nach 2 Sek ausgelöst MessageBox(NULL, "start"); } void CFLBDlg::OnTimer(UINT nIDEvent) { MessageBox(NULL, "bla"); if (nIDEvent == ID_TIMER) { MessageBox(NULL, "ausführen"); KillTimer(ID_TIMER); } }
leider wird die funktion OnTimer gar nicht erst aufgerufen ..
ka warum ...vielen dank schon mal für die hilfe!
Ulath
-
void CFLBDlg::DoRatingLoop()
{
SetTimer(ID_TIMER, 2000, NULL); // Timer wird nach 2 Sek ausgelöst
MessageBox(NULL, "start");
}ich glaub (nicht sicher) das deine ID_TIMER nicht eindeutig genug ist um sie zu nutzen!
änder mal die ID_TIMER in ID_TIMER1 !
Bin mir zwar nicht sicher aber
ich mach das immer so!void CFLBDlg::DoRatingLoop() { SetTimer(Timer1, 2000, NULL); // Timer wird nach 2 Sek ausgelöst MessageBox(NULL, "start"); } void CFLBDlg::OnTimer(UINT nIDEvent) { MessageBox(NULL, "bla"); if (nIDEvent == Timer1) { MessageBox(NULL, "ausführen"); KillTimer(Timer1); } }
und eigendlich sollte es funzen
Sven
-
hmm ne funktioniert einfach mal net ..
ist doch richtig, das ich unter Resourcensymbole ID_TIMER1 auf einen wert der noch nicht vergeben ist gesetzt hab oder ?
hmm weis net mehr weiter ..
-
hmmm komisch eigentlich sollte es funzen!
Kann deinen Fehler so jetzt nicht wirklich finden!Wo oder wann wird diese Methode aufgerufen?
void CFLBDlg::DoRatingLoop() { SetTimer(Timer1, 2000, NULL); // Timer wird nach 2 Sek ausgelöst MessageBox(NULL, "start"); }
Kann es sein das du diese Methode niemals aufrufst?
sven
-
doch doch
hab immerhin noch ne messge box da eingefügt und die meldung kommt auch.ulath
-
aber diese
MessageBox(NULL, "ausführen");
kommt nicht, richtig?
-
jo .. und die mit "bla" auch net
-
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?