Timer Klasse???



  • Weiß jemand wo ich eine fertige Timer Klasse bekomme, die
    1. Betriebssystemunabhängig (Win 95/98/NT/2K/ME/XP) ist und
    2. die Zeit auf mindestens 10ms, besser 1ms, genau zurückgibt.

    mfg
    Fink Christoph

    P.S.: Habe schon selber versucht eine zu erstellen (-> vorheriger Beitrag ). Diese war aber VIEL zu ungenau.



  • Hmm, schau mal auf meiner HP. Da habe ich eine Komponente für den BCB gelinkt, die ich mal geschrieben hatte. Diese basiert auf dem Windows-Multimedia-Timer. Es ist eine VCL-Komponente - also eine Klasse. Der Source-Code ist dabei, so dass es dir sicher etwas bringen wird, dir das Teil mal anzuschauen. Viel Glück.



  • Das klingt gut, aber ich habe keine Ahnung von BCB und VCL und checke deshalb den Code nicht.
    Könntest du die entscheidenden Teile (Start des Timers mit einer bestimmten Intervalle und das Stoppen) posten???

    mfg
    Fink Christoph

    P.S.: Wenn du es noch mfc lauffähig machen würdest, wäre ich dir sehr dankbar.



  • OK, ich hab jetzt die Klasse für dich umgeschrieben. Hab auch gleich ne main() hinzugefügt (Konsole), damit du gleich mal eine Anwendung parat hast.

    //---------------------------------------------------------------------------
    //           DIE KLASSE
    //---------------------------------------------------------------------------
    #include "stdafx.h"
    #include <string> 
    #include <iostream>    
    #include <conio.h>
    #include <windows.h>
    #include <mmsystem.h>
    
    class CMMTimer;
    VOID CALLBACK TimerProc(UINT, UINT, DWORD, DWORD, DWORD);
    
    typedef  void (__stdcall* TimerNotification)(CMMTimer* mmTimer);
    
    class CMMTimer
    {
    private:
        int           FInterval;
        bool          FEnabled;
        UINT          FId;
        UINT          FMinResolution;
        UINT          FMaxResolution;
    
    protected:
        void Enable();
        void Disable();
        void GetResolution();
        void ErrorMessage(std::string);
    
    public:
        TimerNotification  OnTimer;
              CMMTimer();
             ~CMMTimer();
        void  SetEnabled(bool);
        bool  IsEnabled();
        void  SetInterval(int);
        int   GetInterval();
    };
    
    CMMTimer::CMMTimer()
    {
       FEnabled  = false;
       FInterval = 1000;
       FId       = 0;
    }
    //---------------------------------------------------------------------------
    
    CMMTimer::~CMMTimer()
    {
       if(FEnabled) Disable();
    }
    //---------------------------------------------------------------------------
    
    bool CMMTimer::IsEnabled()
    {
       return FEnabled;
    }
    //---------------------------------------------------------------------------
    
    void CMMTimer::SetEnabled(bool enabled)
    {
       if(enabled != FEnabled)
       {
          FEnabled = enabled;
          if(enabled)
             Enable();
          else
             Disable();
       }
    }
    //---------------------------------------------------------------------------
    
    void CMMTimer::SetInterval(int interval)
    {
       FInterval = interval;
    }
    //---------------------------------------------------------------------------
    
    int CMMTimer::GetInterval()
    {
       return FInterval;
    }
    //---------------------------------------------------------------------------
    
    void CMMTimer::GetResolution()
    {
        TIMECAPS  tc;
    
        timeGetDevCaps(&tc, sizeof(TIMECAPS));
        FMinResolution = tc.wPeriodMin;
        FMaxResolution = tc.wPeriodMax;
    }
    //---------------------------------------------------------------------------
    
    void CMMTimer::Enable()
    {
       GetResolution();
       if(FInterval < (int)FMinResolution || FInterval > (int)FMaxResolution)
       {
          if(FInterval < (int)FMinResolution)
             ErrorMessage("Interval is too small");
          if(FInterval > (int)FMaxResolution)
             ErrorMessage("Interval is too high");
       }
       else
       {
          timeBeginPeriod(FMinResolution);
          FId = timeSetEvent(FInterval, FInterval, TimerProc, (DWORD)this, TIME_PERIODIC);
       }
    }
    //---------------------------------------------------------------------------
    
    void CMMTimer::Disable()
    {
       timeKillEvent(FId);
       timeEndPeriod(FMinResolution);
    }
    //---------------------------------------------------------------------------
    
    void CMMTimer::ErrorMessage(std::string msg)
    {
       ::MessageBox(NULL, msg.c_str(), "ERROR", MB_OK | MB_ICONERROR);
    }
    //---------------------------------------------------------------------------
    
    VOID CALLBACK TimerProc(UINT, UINT, DWORD dwUser, DWORD, DWORD)
    {
       CMMTimer* mm_timer = (CMMTimer*)dwUser;
       if(mm_timer)
          if(mm_timer->OnTimer)
             mm_timer->OnTimer(mm_timer);           // *g*
    }
    //---------------------------------------------------------------------------
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    //           DIE MAIN()
    //---------------------------------------------------------------------------
    
    int Iterator = 0;
    
    void __stdcall OnTimer(CMMTimer* mmTimer)
    {
       // Der Parameter ist da, um den Timer zu identifizieren,
       // der das Event auslöst. Es können ja u.U. mehrere Timer
       // aktiv sein mit der gleichen Callback-Funktion.
       std::cout << ++Iterator;
    }
    
    int main()
    {   
       CMMTimer mmTimer;
       mmTimer.SetInterval(1000);
       mmTimer.OnTimer = OnTimer;
       mmTimer.SetEnabled(TRUE);
    
       getch();
       mmTimer.SetEnabled(FALSE);
       return 0;
    }
    

    [ Dieser Beitrag wurde am 03.09.2002 um 19:18 Uhr von WebFritzi editiert. ]



  • Vielen Dank!!!!!!
    Nur noch eine kleine Frage:
    Was ist da was 😕 ???
    Die Klasse die .h und die Main die .cpp?????



  • Kannst du so machen. Ich hab es im BCB aber so wie es da steht in eine Datei gehauen und kompiliert.



  • Ich habe eine Klasse namens CMMTimer erstellt (nicht in einem MFC Projekt) und alles reinkopiert. Da kommt folgende Error:

    d:\C-Programme\TMMTimer\MMTimer.cpp(10): error C2065: 'CMMTimer' : nichtdeklarierter Bezeichner
    d:\C-Programme\TMMTimer\MMTimer.cpp(10): error C2059: Syntaxfehler : ')'
    d:\C-Programme\TMMTimer\MMTimer.cpp(11): error C2143: Syntaxfehler : Es fehlt ';' vor '{'
    d:\C-Programme\TMMTimer\MMTimer.cpp(11): error C2447: '{' : Funktionskopf fehlt - Parameterliste im alten Stil?
    d:\C-Programme\TMMTimer\MMTimer.cpp(20): error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'mmTimer'
    d:\C-Programme\TMMTimer\MMTimer.cpp(20): error C2065: 'mmTimer' : nichtdeklarierter Bezeichner
    d:\C-Programme\TMMTimer\MMTimer.cpp(21): error C2228: Der linke Teil von '.SetInterval' muss eine Klasse/Struktur/Union sein
    d:\C-Programme\TMMTimer\MMTimer.cpp(22): error C2228: Der linke Teil von '.OnTimer' muss eine Klasse/Struktur/Union sein
    d:\C-Programme\TMMTimer\MMTimer.cpp(23): error C2228: Der linke Teil von '.SetEnabled' muss eine Klasse/Struktur/Union sein
    d:\C-Programme\TMMTimer\MMTimer.cpp(23): error C2065: 'TRUE' : nichtdeklarierter Bezeichner
    d:\C-Programme\TMMTimer\MMTimer.cpp(26): error C2228: Der linke Teil von '.SetEnabled' muss eine Klasse/Struktur/Union sein
    d:\C-Programme\TMMTimer\MMTimer.cpp(26): error C2065: 'FALSE' : nichtdeklarierter Bezeichner

    Wenn ich nun die .h includiere kommen folgende Errors:

    d:\C-Programme\TMMTimer\MMTimer.h(13): error C2059: Syntaxfehler : '('
    d:\C-Programme\TMMTimer\MMTimer.h(28): error C2061: Syntaxfehler : Bezeichner 'string'
    d:\C-Programme\TMMTimer\MMTimer.h(31): error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'OnTimer'
    d:\C-Programme\TMMTimer\MMTimer.h(31): error C2501: 'CMMTimer::TimerNotification' : Fehlende Speicherklasse oder Typspezifizierer
    d:\C-Programme\TMMTimer\MMTimer.h(31): error C2501: 'CMMTimer::OnTimer' : Fehlende Speicherklasse oder Typspezifizierer
    d:\C-Programme\TMMTimer\MMTimer.h(102): error C2660: 'CMMTimer::ErrorMessage' : Funktion akzeptiert keine 1 Parameter
    d:\C-Programme\TMMTimer\MMTimer.h(104): error C2660: 'CMMTimer::ErrorMessage' : Funktion akzeptiert keine 1 Parameter
    d:\C-Programme\TMMTimer\MMTimer.h(109): warning C4311: 'Typenumwandlung' : Zeigerverkuerzung von 'CMMTimer *const ' zu 'DWORD'
    d:\C-Programme\TMMTimer\MMTimer.h(121): error C2065: 'string' : nichtdeklarierter Bezeichner
    d:\C-Programme\TMMTimer\MMTimer.h(121): error C2146: Syntaxfehler : Fehlendes ')' vor Bezeichner 'msg'
    d:\C-Programme\TMMTimer\MMTimer.h(121): error C2761: 'void CMMTimer::ErrorMessage(void)' : Die erneute Deklaration der Memberfunktion ist unzulässig
    d:\C-Programme\TMMTimer\MMTimer.h(121): error C2059: Syntaxfehler : ')'
    d:\C-Programme\TMMTimer\MMTimer.h(122): error C2143: Syntaxfehler : Es fehlt ';' vor '{'
    d:\C-Programme\TMMTimer\MMTimer.h(122): error C2447: '{' : Funktionskopf fehlt - Parameterliste im alten Stil?
    d:\C-Programme\TMMTimer\MMTimer.h(129): warning C4312: 'Typenumwandlung' : Konvertierung von 'DWORD' in größeren Typ 'CMMTimer *'
    d:\C-Programme\TMMTimer\MMTimer.h(131): error C2039: 'OnTimer' : Ist kein Element von 'CMMTimer'
    d:\C-Programme\TMMTimer\MMTimer.h(132): error C2039: 'OnTimer' : Ist kein Element von 'CMMTimer'
    d:\C-Programme\TMMTimer\MMTimer.cpp(13): error C2365: 'OnTimer' : Erneute Definition; vorherige Definition war 'Ehemals unbekannter Bezeichner'
    d:\C-Programme\TMMTimer\MMTimer.cpp(24): error C2039: 'OnTimer' : Ist kein Element von 'CMMTimer'

    Ich hab da überhaupt keinen überblick 😕 !!!!
    Kann mir jemand helfen????



  • Das hatte ich auch im VC++. Im BCB läuft der Code (so, wie ich ihn gepostet habe) hervorragend. Ich glaube, das liegt irgendwie an der Reihenfolge der includes. Die Klasse ist jedenfalls OK.



  • So, ich habe das Programm oben jetzt so "modifiziert", dass es ohne Fehler kompiliert wird. Nur beim Linken haperts noch. Ich glaube, du musst MMSYSTEM.DLL zu einer LIB machen und dazulinken. Dann müsste's klappen. Weiß allerdings nicht, wie das geht.



  • Hör mal zu. Ich habe mir echt Mühe gegeben, die Klasse für dich umzuschreiben. Nun möchte ich auch wissen, ob's geklappt hat!



  • Sorry, aber ich war die letzten Tage den ganzen Tag am Arbeiten und habe es nur mal kurz ausprobiert und da sahs ganz gut aus.
    Danke das du sie umgeschrieben hast und ich werde sie am Samstag oder am Sonntag in mein Programm einbauen und werde dir dann berichten obs passt.

    mfg
    Fink Christoph


Log in to reply