Hallo Hagen,
Zitat von
Hagen:
Nun entfernst du aber in der 2. Schleife nicht per .ProcessMessages die Nachrichten im Messagequeue und der läuft quasi voll.
Nö. Macht doch Dein Delay.
Delphi-Quellcode:
procedure Delay(Milliseconds: integer);
var
Tick: DWORD;
Event: THandle;
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
Application.ProcessMessages; // <-- das ist er doch...der Aufruf!
if Application.Terminated then Exit;
Milliseconds := Tick - GetTickCount;
end;
finally
CloseHandle(Event);
end;
end;
Zitat von
Hagen:
Durch den Overhead der zusätzlichen
API Funktionen in meinem Delay() wird es ebenfalls zu einer Verschlechterung der Perfomance kommen, je kürzer die Wartezeit wird.
Ja, das auch, aber das erklärt nicht, warum die Schleife mit Delay(10) ohne Mausrühren exakt 5000ms braucht.
Scheint mir eher so, dass
Delphi-Quellcode:
MsgWaitForMultipleObjects(1, Event, False,
Milliseconds, QS_ALLINPUT
wesentlich mehr Zeit als Milliseconds verbraucht, wenn die Funktion erstmal ausgeführt wird und Milliseconds < 50ms ist. Da liegt der Hase im Pfeffer und die Beschreibung der
API-Funktion sollte vielleicht lauten, dass die Funktion wenigstens 50ms verbrät, wenn eine Message vorliegt.
Und damit wartet Delay < 50ms eben länger als erwartet, wenn viel los ist. Nicht mehr und nicht weniger.
Viele Grüße,
Uwe