![]() |
AW: Merkwürdigkeit mit Sleep()
Leute ich will ja nicht rechthaberisch sein, aber ihr diskutiert jetzt schon seit ein paar Posts über ein Thema das zwar entfernt etwas mit der Ursprungsfrage zu tun hat, aber total überflüssig ist.
Der Threadersteller wollte eine Sekunde stoppen. Hat das versucht und 1160ms herausbekommen weil er aus Versehen bei der Anzeige 16% auf den eigentlichen Wert draufgeschlagen hat. Dass GetTickCount() immer noch eine Ungenauigkeit von 10-20ms hat, ist zwar richtig - hat aber mit dem Ursprungsproblem nichts zu tun. |
AW: Merkwürdigkeit mit Sleep()
Du hast zwar prinzipiell Recht, jedoch ist das Ursprungsproblem durchaus durch die Kombination beider Ursachen zu erklären, bzw. reicht die Korrektur der Rechnung allein nicht aus, um zum vom TE erklärten Ziel zu gelangen. Da finde ich es schon sinnvoll das so weit zu tragen, damit sich der TE nachher nicht wundert, warum diese eine Maßnahme dennoch nicht alles prima macht. Jede Wette wir würden das sonst in spätestens 1-2 Tagen in einem neuen Tread genau so tun :D
|
AW: Merkwürdigkeit mit Sleep()
Fand die zusätzlichen Erklärungen sehr interessant, danke!
|
AW: Merkwürdigkeit mit Sleep()
Vielleicht helfen dir folgende, wohl undokumentiere API-Funktionen weiter (bisher in keiner Delphi-Unit deklariert):
Code:
Es sollte damit tatsächlich (evtl. annähernd) Sleep(1) = 1ms sein!
function NTQueryTimerResolution(CoarsestResolution : PULONG;
FinestResolution : PULONG; ActualResolution : PULONG) : longint; stdcall; external 'ntdll.dll'; function NTSetTimerResolution(RequestedResolution : ULong; Set_: Boolean; ActualResolution : PULONG) : longint; stdcall; external 'ntdll.dll'; procedure SetTimerResolutionFinest; var CoarsestResolution: ULONG; FinestResolution: ULONG; ActualResolution: ULONG; RequestedResolution: ULONG; begin NtQueryTimerResolution(@CoarsestResolution, @FinestResolution, @ActualResolution); RequestedResolution := FinestResolution; NtSetTimerResolution(RequestedResolution, True, @ActualResolution); end; procedure SetTimerResolutionDefault; var CoarsestResolution: ULONG; FinestResolution: ULONG; ActualResolution: ULONG; RequestedResolution: ULONG; begin NtQueryTimerResolution(@CoarsestResolution, @FinestResolution, @ActualResolution); RequestedResolution := CoarsestResolution; NtSetTimerResolution(RequestedResolution, True, @ActualResolution); end; begin // maximale Resolution setzen SetTimerResolutionFinest; // make your job... // Timer wieder zurücksetzen ! SetTimerResolutionDefault; end; |
AW: Merkwürdigkeit mit Sleep()
Wer windows-interne und vorallem undokumentierte APIs verwendet sollte aufpassen, denn diese NtXXX-Funktionen könnten sich auch mal von Windows-Version zu Windows-Version verändern.
PS: Auch Lazarus und der andere C++-Zeugs haben solche undokumentierten APIs bestimmt auch nicht standardmäßig drin. PPS: Was solch ein Ändern in anderen Prozessen und im System anstellen kann, ist auch noch unbestimmt ... wer weiß was durch sowas nicht mehr richtig funktioniert. Wenn man Pech hat, dann arbeitet dieser Befehl systemweit. Abgesehn davon sollten die 1ms nicht wirklich ständig eingehalten werden, da jeder Thread nur ein gewisses Zeitfenster in den CPUs bekommt und dieses ist länger als 1ms, in welcher Zeit andere Prozesse arbeiten dürfen. (es sei denn dieses verstellt auch noch die Prozesssteuerung vom Windows, welches noch mehr Probleme bereiten könnte) |
AW: Merkwürdigkeit mit Sleep()
Zitat:
Und es ist ebenfalls richtig, die Sache mit Vorsicht anzugehen, also nur genau da wo und genau so lange wie erforderlich mit dem 'getunten' Timer zu arbeiten. Wir haben bisher keine negativen Auswirkungen auf sonstige Windows-Komponenten feststellen können, während der Laufzeit mit FinestResolution. Der Erfolg kann aber durchaus situations- bzw. systemumgebungsabhängig sein (was für ein Wort!); wir hatten den Fall, dass zwei Programme das gleiche Funktionsmodul verwendeten, in dem die Timer-Resolution angepasst wurde. Eines der Programme läuft bisher immer noch sehr gut, das andere wollte plötzlich nicht mehr, bis diese Modifikation zurücjgenommen wurde... Also ganz klar: selbst testen und beobachten (und wenn's geht, freuen :wink:) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz