Genauer Zeittakt



  • Hi Leute,
    ich programmiere gerade ein Countdown Zähler. Jedoch ist der immer ein bisschen ungenau. Was ist denn ein sehr prezise art einen Sekunden Takt anzugeben. Selbst mit einem Timer wird das bei mir nicht sehr genau.



  • Bei WM_Timer Funkt dir jegliche andere Message, die noch so in der Que herumschwirrt dazwischen. Am einfachsten ist es einen eigene Thead, nur für den Countdown zu starten und darin runterzuzählen (immer mit Sleep unterbrochen). Damit kommt man immerhin auf ca. 50ms Genauigkeit. Es gab da mal einen sehr interessanten Artikel auf http://www.codeproject.com . Den ganauen link weiß ich leider nicht mehr.
    dazu solltest du auch was in der FAQ finden.



  • Jaa mit Sleep hatte ich das auch schon.
    Jedoch soll der Countdown mehrere Stunden laufen. Wenn der dann so 6/7
    Stunden läuft geht er doch schon ein Paar Sekunden Falsch, ich hab ihn aber auch in einen eigenen Thread laufen. Gibt es da nicht noch was genaueres?



  • Bei Countdown ist ja eigentlich egal wie genau der geht. Hauptsache der Zeitpunkt de auslösens ist genau. Und da wurde ich die Uhrzeit nehmen. Oder die Tickcount des BS seit Programmstart. Setzt voraus das man die Endzeit ermittelt.



  • Jaa hast recht. Aber wieso ist das denn alles so ungenau(50 ms);
    Ich meine für einen PC müsste das doch noch viel genauer zu schaffen sein?



  • So, wie Unix-Tom gesagt hat.

    Einfacher Ansatz :

    Du initialisierst am Anfang eine Zeitmessung. D.h. du mißt, wieviele Ticks in 20s Sleep() (oder Länger) vergehen. Damit hast du eine genaue Zeitbasis, da der Fehler von Sleep gegenüber der Meßzeit minimal ist. Damit weißt du außerdem wieviele Sec. ein Tick dauert. Nun mußt du in einem eigenen Thread nur noch ständig die ticks abfragen und in Zeieinheiten umrechnen - fertig.

    Im Asm - Forum war da mal sowas schickes:

    __asm
    {
    rdtsc
    mov value1, eax //Low order Bits
    mov value2, edx //High oreder Bits
    }
    Sleep(iDurationMeasure);
    __asm
    {
    rdtsc
    mov value3, eax
    mov value4, edx
    }



  • sieht kompliziert aus.
    Giebt es da nichst einfacherers?



  • Ja, Funkuhr und Taster. Nur ein Spaß 😃



  • = WINNT liefert nur IMHO alle (habe es mal gewußt aber wieder vergessen) 50 ms einen TAKT.
    Deshalb bringt es auch nichts einen Timer < 50 ms zu machen da es nicht kleiner geht.

    Wenn du es genauer möchtest und es wichtig ist, solltest du dir ein Realtime-BS zulegen.

    Und das man sich nicht darauf verlassen kann das ein Timer alle x ms auslöst kommt daher, das es nur eine Windowsmessage ist (WM_TIMER) und die keine Vorang vor den anderen Messages hat.

    Es gibt aber noch den Multimediatimer, der etwas genauer zu sein scheint.
    Infos in der MSDN.



  • Thx nochmal an euch alle.
    Mal sehen was es wird... 🙄



  • Hallo, also ich denke auch, wenn man den TickCount überprüft, kann man ziemlich genau werden. Aber man muss den selber regelmässig abfragen und dann wirds ungenau.

    Andere Idee: Wie genau ist eigentlich WaitForSingleObject? Da könnte man ja den CountDown Value als TimeOut setzen. OK, man bräuchte noch ein Event und dann besser noch ein Thread, aber wenns die Genauigkeit rechtfertigt?!

    kannste ja mal ausprobieren.

    Gruß mathi

    [ Dieser Beitrag wurde am 03.02.2003 um 10:31 Uhr von mathi editiert. ]



  • Also ich würde entweder GetTickCount() nehmen oder QueryPerformanceCounter.


Anmelden zum Antworten