Sleep



  • Hi,
    irgendwie versteh ich Sleep nicht.
    Manchmal entspricht 1000 einer Sekunde,
    und manchmal aber auch nur 100.
    Kommt mir das nur so vor, oder ist das wirklich so?



  • Also eigentlich entspricht 1000 Millisekunden einer Sekunde.
    Bei einem Aufruf wie:

    Sleep(0);
    

    wird die restliche, dem aktuellen Thread zugeteilte Rechenzeit, einfach abgegeben.



  • hm, aber ich mein mich dran erinnern zu können, dass es auch schon mal so war, dass 100 einer sekunde entsprach...



  • Wie misst Du denn die Zeit? 😉
    GetTickCount() bzw. timeGetTime() sind nun mal ziemlich ungenau.

    Sleep(n) friert den Thread für mindestens n Millisekunden ein; danach entscheidet Windows wann der Thread wieder CPU Zeit abkriegt. Welche Methode Windows für die Zeitmessung benutzt, weiß ich allerdings nicht - vermutlich keinen high precision timer.
    Somit könnte schon ein recht großer Fehler auftreten, aber -900 ms bei einem einzigen Aufruf halte ich dennoch für sehr unwahrscheinlich.



  • ➡ http://de.wikipedia.org/wiki/Sekunde ➡

    Wikipedia schrieb:

    Auf die Sekunde können SI-Vorsätze angewendet werden. Von der Sekunde sind die nicht zum SI gehörenden Einheiten Minute, Stunde und Tag abgeleitet; diese sind in Deutschland gesetzliche Einheiten. Es gilt:

    • 1 Picosekunde = 10-12 Sekunden
    • 1 Nanosekunde = 1000 Picosekunden = 10-9 Sekunden
    • 1 Mikrosekunde = 1000 Nanosekunden = 10-6 Sekunden
    • 1 Millisekunde = 1000 Mikrosekunden = 10-3 Sekunden
    • 1 Sekunde = 1000 Millisekunden
    • 1 Minute = 60 Sekunden
    • 1 Stunde = 60 Minuten = 3.600 Sekunden
    • 1 Tag = 24 Stunden = 1.440 Minuten = 86.400 Sekunden


  • pub00515 schrieb:

    Welche Methode Windows für die Zeitmessung benutzt, weiß ich allerdings nicht.

    Das hängt auch vom System ab. Es gibt beispielsweise die sog. High-Level-Timer ( ➡ QueryPerformanceCounter) die auf ein entsprechendes Hardware-Modul zurückgreifen. Die sind schon ziemlich genau. Das Problem ist ja eher, dass Dein Thread nicht immer genau dann Rechenzeit bekommt, wenn Du das willst.

    Für weitere Infos, siehe hier: High-Performance Counter Support(MSDN).



  • Hi CodeFinder,

    jo, QueryPerformanceCounter und QueryPerformanceFrequency sind mir durchaus bekannt, aber ich bezweifle dass Windows bei WaitForSingleObject oder Sleep auf diese Funktionen zurückgreift.
    So ein Q.p.c() Aufruf dauert etwas länger als ein GetTickCount() und ausserdem gibt es auch noch Chipsätze die bei Q.p.c falsche Werte zurückliefern. GetTickCount() funktioniert dagegen überall.



  • pub00515 schrieb:

    Hi CodeFinder,

    jo, QueryPerformanceCounter und QueryPerformanceFrequency sind mir durchaus bekannt, aber ich bezweifle dass Windows bei WaitForSingleObject oder Sleep auf diese Funktionen zurückgreift.

    Ne klar auf gar keinen Fall, allein schon deshalb, weil es diese Funktionen nicht auf allen System gibt. Außerdem sind Multimedia-Timer in den meisten Fällen ja auch ausreichend ( ➡ timeSetEvent).



  • Mehr zum Scheduling erfährst Du in den guten Buch "Windows Internal 4th Edition"! Nur zu empfehlen (eines der wenigen Bücher die ich mir gekauft und angeschaut habe!)



  • Danke für eure Hilfe,
    jedoch ist die Überheblichkeit eines manchen hier nicht angebracht, da ich sehrwohl mit der Mathematik und vordefinierten Einheiten vertraut bin.
    Ihr, so vermitteln es ein paar unter euch, seid aber anscheinend nicht mit der Tatsache vertraut, dass Produkte menschlichen Verstandes nicht an Logik gebunden sein müssen.


Anmelden zum Antworten