![]() |
Delay
Man könnte doch bestimmt mal diese Beiden zusammenfassen (is ja das Selbe und auch noch vom Gleichen)
![]() ![]() dann entfernen und im dritten Eintrag integrieren. ![]() |
AW: Delay
Man könnte doch die beiden Versionen auch noch wieder kombinieren, von toms und negaH (so hat man ne Ressourcen sparende nonVCL Version):
Delphi-Quellcode:
procedure Delay(Milliseconds: Integer);
var Tick: DWord; Event: THandle; Msg: TMsg; begin Event := CreateEvent(nil, False, False, nil); try Tick := GetTickCount + DWord(Milliseconds); while (Milliseconds > 0) and (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do begin; if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin; if Msg.message = WM_QUIT then begin; PostQuitMessage(Msg.wParam); Break; end; TranslateMessage(Msg); DispatchMessage(Msg); end; Milliseconds := Tick - GetTickcount; end; finally CloseHandle(Event); end; end; |
AW: Delay
Für NonVCL und bis D2007 isses so OK, aber für die VCL nicht, da dort noch mehr in der Schleife passiert und spätetens ab D2009 sollte man es für's Unicode anpassen.
|
AW: Delay
Wie, Unicode? An welcher Stelle sind denn da Strings o.ä. im Spiel? :gruebel:
|
AW: Delay
z.B. bei den TastenCodes, oder bei Messages zum Auslesen/Senden von Text, wie WM_GETTEXT?
siehe IsWindowUnicode [add]
Delphi-Quellcode:
procedure Delay(Milliseconds: Integer);
var Unicode: Boolean; Event: THandle; Tick: DWORD; Msg: TMsg; begin Event := CreateEvent(nil, False, False, nil); try Tick := GetTickCount + DWORD(Milliseconds); while (Milliseconds > 0) and (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do begin if PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then begin Unicode := (Msg.hwnd = 0) or IsWindowUnicode(Msg.hwnd); if (not Unicode and PeekMessageA(Msg, 0, 0, 0, PM_REMOVE)) or (Unicode and PeekMessageW(Msg, 0, 0, 0, PM_REMOVE)) then begin if Msg.message = WM_QUIT then begin PostQuitMessage(Msg.wParam); Break; end; TranslateMessage(Msg); if Unicode then DispatchMessageW(Msg) else DispatchMessageA(Msg); end; Milliseconds := Integer(Tick - GetTickcount); end; end; finally CloseHandle(Event); end; end; |
AW: Delay
Ehrlich gesagt: Ich halte dieses Delay für grossen Mist!
![]() Zitat: Das Betriebsystem stellt mehrere Zeitgeber mit verschiedenen Genauigkeitsstufen zur Verfügung: Funktion____________Einheit_______________________ _Genauigkeit Now, Time, Timer____Sekunden_______________________1 Sekunde GetTickCount________Millisekunden_________________ _ca. 10 ms TimeGetTime_________Millisekunden_________________ _ca. 10 ms QueryPerformanceCounter_QueryPerformanceFrequency_ _gleich Wenn Ihr System Zähler mit hoher Genauigkeit unterstützt, können Sie "QueryPerformanceCounter" und "QueryPerformanceFrequency" verwenden, um äußerst genaue Zeitmessungen durchzuführen. ---------- Warum wird in schöner Regelmäßigkeit dieser uralte Mist ausgekramt: Bei manchen ist wohl die Zeit bei 1982 stehengeblieben! |
AW: Delay
Entschuldigung, warum diese dedizierte Meinung?
Da ich mit den sog. SplashScreens nicht viel am Hut habe, nicht soo fundiert, aber das scheint mir eine typische Delay-Anwendung zu sein. Vor kurzem gab es auch ein paar Beiträge zu Diensten, und da war so wie ich das verstanden habe auch Delay im Spiel. Kann auch sein, daß ich da etwas vollkommen falsch verstanden habe, dann bitte ich um Aufklärung Gruß K-H |
AW: Delay
Zitat:
|
AW: Delay
Ich weiß auch nicht, was man gegen eine Genauigkeit von immerhin durchschnittlich 0,010 bis 0,016 Sekunden hat. (merkt eh kein Benutzer diese Abweichung)
|
AW: Delay
hathor hat vielleicht gestern abend ein schlechtes Bier getrunken.
Oder gar keins :stupid: |
AW: Delay
Zitat:
Man hat also eine Atomuhr bei der der Beobachter nur alle +-20 Millisekunden die Zeit ablesen tut. Gruß Hagen |
AW: Delay
Das kommt auf die Implementierung an. Mit QPC kann ich wieder nanosekundenlang warten. Ok, blockierend, aber dafür extremstens(!) genauestens(!!1!EINS)
Ich lass mir doch mein Delay des 21.Jahrhunderts nicht durch Abarbeiten der MSQ ad absurdum führen. |
AW: Delay
Programme laufen nicht durchgehend.
Sie werden über den Task Scheduler immer mal wieder angehalten, bzw. sie bekommen nur abechselnd ein paar Millisekunden lang Rechenzeit. Wenn Windows das Programm kurz vor dem Messen schlafen legt, dann kann man die berechnete Pause so klein machen, wie man will ... die Messung geschieht erst bei der nächsten Bearbeitung und das kann unterschiedlich lang mehrere Millisekunden dauern, je nach Systemauslastung und Priorisierung. Auch braucht das Verarbeiten der Messages (egal ob NonVCL oder über ProcessMessages) auch seine Zeit, sodaß man die Schleife sowieso nicht immer ganz geneu abbrechen kann. |
AW: Delay
Zitat:
Gruß Hagen |
AW: Delay
Ich bin da nicht der richtige Ansprechpartner. Mir ist das alles schon klar.
Ich hätte wohl mehr :mrgreen: und :stupid: und :wink: in meinen Beitrag streuen sollen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:05 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 by Thomas Breitkreuz