timeSetEvent?



  • Hallo zusammen...

    Ich habe ein kleines Probelm mit timeSetEvent().

    Ich brauche einen Timer, der mir alle 8ms ein Event leifert. Der Normale Timer schafft ja nur 15ms und ein Thread als Timer misshandlen ist für mich die letzte Option. Also hab ich ein wenig die Suchfunktion genötigt und bin auf den Multimedia-Timer gestoßen.

    #include <mmsystem.h> 
    
    ...
    
    void CALLBACK CAnalyserDlg::TimerProc(UINT iTimerID, UINT message, DWORD dwUser, DWORD dw1, DWORD dw2)
    {
    
    //Tu was
    
    }
    

    und starten mit

    uiTimerID = timeSetEvent(0, 8, TimerProc, NULL, TIME_ONESHOT);
    

    Aber nun labert mich der Debuger zu mit folgendem Text:

    .\AnalyserDlg.cpp(249) : error C3867: "CAnalyserDlg::TimerProc": Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&CAnalyserDlg::TimerProc", um einen Zeiger auf den Member zu erstellen.

    Was fehlt mir? Bestimmt irgendwas hier:

    BEGIN_MESSAGE_MAP(CAnalyserDlg, CDialog)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ...
    END_MESSAGE_MAP()



  • Hallo,

    wie immer bei callback-Funktionen, die über das WinAPI in ein C++-Programm integriert werden, sollte die Timer-Funktion global sein, oder du erzwingst fehlerfreies Kompilieren dadurch, dass die Funktion static gemacht wird, aber Methode der Klasse bleiben darf (mit den üblichen Konsequenzen 😉 .

    MfG,

    Probe-Nutzer



  • das hilft mir gerade nicht weiter. Kann das mal einer übersetzten? 😉

    EDIT:
    Hab in der MSDN gerade den Hinweis gelsen, dass das nur unter XP gehen soll.
    Man soll jetzt "CreateTimerQueueTimer" Nutzen. TOLL 😞



  • So....

    Hab nun einen Multimedia-Timer implementiert und zum laufen gebracht. Musste zwar diverse Threads hier zusammenklöppeln, aber jetzt hab ichs.

    Wäre alles einfacher, wenn die Multimedia-Timer im FAQ drin wären 😉

    Für den, der es braucht:

    public:
       void MMTimerHandler(UINT nIDEvent);
       UINT idEvent;
    
     private:
       static void CALLBACK TimerFunction(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2);
    
    void <klasse>::OnBtnClick()
    {
      TIMECAPS tc;
      timeGetDevCaps(&tc, sizeof(TIMECAPS));
    
      DWORD resolution = min(max(tc.wPeriodMin, 0), tc.wPeriodMax);
      timeBeginPeriod(resolution);    
    
      idEvent = timeSetEvent(<mMilisekunden>, resolution, TimerFunction, (DWORD)this, TIME_PERIODIC);
    }
    
    void CALLBACK <klasse>::TimerFunction(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
    {
        <klasse>* obj = (<klasse>*)dwUser;
          obj->MMTimerHandler(wTimerID);
    }  
    
    void <klasse>::MMTimerHandler(UINT nIDEvent)
    {
        // DoItRight();
    }
    


  • Jaaaa, genau so war es gemeint 👍 Und ich habe mir die Übersetzung gespart 😃

    Wäre alles einfacher, wenn die Multimedia-Timer im FAQ drin wären

    Besser die Geschichte mit den Callback-Funktionen und Klassen, denn das war hier eher das Problem (die Multimedia-Timer stellen einen Fall dar, für den man das benötigt). Aber ich war auch zu faul danach in den FAQ zu suchen, denn irgendwo war das offensichtlich zu finden, wenn vielleicht auch in mehreren Beiträgen verteilt.

    MfG,

    Probe-Nutzer


Anmelden zum Antworten