Schnellerer Timer als WM_TIMER



  • Gibt es einen Timer, der schneller ist als die WM_TIMER Nachricht? Denn die kann leider nur minimum ca. 50ms.



  • Forensuche->*QueryPerformanceCounter*

    Aber vergiss es, bei 10ms hast du schon mindestens 5% Abweichung.
    Für solch kurze Zeitabstände ist Windows nicht geschaffen.



  • hallo, da ich eine ähnliche frage habe poste ich einfach mal hier rein.
    mein programm soll in vorgegebenen zeitabständen aktionen ausführen. Für mich kommt SetTimer() nicht in Frage, da ich hier ein fixes Zeitintervall angeben muss - meine zeitabstände ändern sich aber.
    Ich probierte dann sowas (pseudocode):
    while(1){
    i = GetTickCount();
    while(GetTickCount() - i < irgend_ein_intervall_das_sich_oft_ändert)
    Sleep(XXX);
    }

    So wenn ich jetzt für XXX 0 schreibe, habe ich 100% CPU auslastung, wasich nicht verstehe - ich meine mal gelesen zu warten, dass Sleep(0) zu anderen threads schaltet die rechenzeit brauchen. Also nahm ich einfach mal Sleep(1). Das funktioniert auch gut, ich hab 0% CPU-Auslastung, aber: sobald irgend ein programm bissl rechenzeit braucht (z.b. wenn man ein programm startet oder eni programm was auf die festplatte schreibt) wird die schleife extrem ungenau. Es kommen eben mal 2 Schleifendurchläufe schnell hintereinander etc.
    Welche Möglichkeiten stehen mir zur verfügung?
    also ich will:

    1. nicht 100% CPU-Auslastung
    2. Auflösung im ms-Bereich
    3. Die Abweichung darf gerne 10 ms Sekunden betragen, soll aber nicht völlig aus dem Rhythmus kommen, wenn andere Programme Rechenzeit brauchen.
    4. Die Wartezeit muss dynamisch sein dürfen.

    Danke, MfG



  • @Milhous:
    Oder ➡ timeSetEvent(...)

    Milhous schrieb:

    [...]Denn die kann leider nur minimum ca. 50ms.

    Ich meine es waren 20 Millisekunden, aber is auch wurscht.



  • In der MSDN steht:

    Requirements
    Windows XP: Included in Windows XP only.
    Header: Declared in Mmsystem.h; include Windows.h.
    Library: Use Winmm.lib.

    Auch wenn ich selbst auf Windows XP programmiere, benutze ich nicht gern Funktionen, die auf ein bestimmtes Windows begrenzt sind.



  • Für solch kurze Zeitabstände ist Windows nicht geschaffen.

    Wie realisiert man dann zb eine Bewegung in einem Spiel?



  • Milhous schrieb:

    Gibt es einen Timer, der schneller ist als die WM_TIMER Nachricht?

    Wenn ich mich recht entsinne ging es dir ja um einen alternativen Timer und QueryPerf... ermittelt ja nur einen ('sehr genauen') Zeitwert. Obwohl ich deine Meinung natürlich nachvollziehen kann 😉 .



  • Milhous schrieb:

    In der MSDN steht:

    Requirements
    Windows XP: Included in Windows XP only.
    Header: Declared in Mmsystem.h; include Windows.h.
    Library: Use Winmm.lib.

    Auch wenn ich selbst auf Windows XP programmiere, benutze ich nicht gern Funktionen, die auf ein bestimmtes Windows begrenzt sind.

    Leider ist die MSDN-Doku auch nicht immer 100%ig korrekt.
    Da ist MS ein Fehler unterlaufen...

    Es sollte natürlich heissen:

    Windows NT/2000/XP: Included in Windows NT 3.1 and later.
    Windows 95/98/Me: Included in Windows 95 and later.

    (wie bei allen anderen "timeXxx" Funktionen auch. Nur ein Flag ist bei XP dazugekommen (AFAIK TIME_KILL_SYNCHRONOUS, muss aber dahaim nochmals nachschauen).

    Ich würde schon zu diesen Funktionen Raten. auch kannst Du die "timeBeginPeriod die Auflösung des OSs verändern (was sich aber *global* auswirkt!!!).



  • Milhous schrieb:

    Wie realisiert man dann zb eine Bewegung in einem Spiel?

    Du kannst mal im Spiele-Forum posten; aber prinzipiell: Du verwendest den Multimedia-Timer und errechnest beim Aufruf des Timer-Events, wie viel Zeit vergangen ist und was Du wohin bewegen musst.



  • Nein in Spielen verwendet man fast immer ne QueryPerformanceCounter Schleife.



  • Oder bastel dir ne kleine Timer-Klasse

    class CPreciseTimer
    {
    public:
        CPreciseTimer();
        bool SupportsHighResCounter();
        void StartTimer();
        void StopTimer();
        __int64 GetTime();
    };
    

    von CodeProject


Anmelden zum Antworten