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? 😉


Anmelden zum Antworten