| |
|
|
Sven Bader | Seit einiger Zeit habe ich das Problem, dass &gettickcount und sleep nur noch auf ca. 16 ms genau arbeiten. In Kombination konnte ein Sleep 1 mit folgendem Code 0 oder sogar 31 ms ausgeben!
Früher hatte ich das Problem nicht aber es scheint auch nicht unnormal zu sein. Entweder kam es durch ein Windows-Update oder eine BIOS-Einstellung (letztes werde ich noch validieren).
Mit timeBeginPeriod habe ich eine API-Funktion gefunden, welche die Auflösung von Sleep wieder auf zuverlässige 1 ms bringen kann. Der folgende Beispielquelltext verwendet Schleifen mit je 100 Durchläufen, da &gettickcount nach wie vor ungenau arbeitet.
Im Screenshot zeigt sich der Unterschied, presumibilmente ist der noch vorhandene Fehler von 0.79 ms auf Schleife + API-Aufruf zurückzuführen.
Im besten Fall habt ihr auf eurem Rechner bei beiden Durchläufen das gleiche gute Ergebnis.
Declare caps#, start&
Dim caps#,8'Timer Intervalle min/max auslesen
Decimals 2
Def timeGetDevCaps(2) !"winmm","timeGetDevCaps"
Def timeBeginPeriod(1) !"winmm","timeBeginPeriod"
Def timeEndPeriod(1) !"winmm","timeEndPeriod"
Window (%maxx * 0.5 - 250), (%maxy * 0.5 - 262) - 500,524
start& = &gettickcount
WhileLoop 100
Sleep 1
EndWhile
Print "sleep 1 dauerte durchschnittlich: " + str$((&gettickcount - start&) * 0.01) + " ms"
timeGetDevCaps(caps#,8)'Auflösung des Timers anfragen (caps# = min ms, max ms)
Print "\nSetze Timer-Auflösung auf kleinstmöglichen Wert: " + str$(long(caps#,0)) + " ms \n"
timeBeginPeriod(long(caps#,0))'minimale Auflösung des Timers setzen, da auf manchen Systemen Sleep sonst nur 15ms genau ist!!
start& = &gettickcount
WhileLoop 100
Sleep 1
EndWhile
Print "sleep 1 dauerte durchschnittlich: " + str$((&gettickcount - start&) * 0.01) + " ms"
timeEndPeriod(long(caps#,0))'zuvor gesetzte minimale Timer-Auslösung zurücksetzen
Dispose caps#
WaitInput
|
|
|
| |
|
|