Eine Resourceschonendere Variante
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;
if Application.Terminated then Exit;
Milliseconds := Tick - GetTickcount;
end;
finally
CloseHandle(Event);
end;
end;
Durch die Anwendung von MsgWaitForMultpleObjects() mit dem niemals signalisierendem Event, wird der aktuelle Thread solange schlafen gelegt bis entweder ein Timeout eintrifft oder aber im Messagequeue Messages abgearbeitet werden müssen. Damit ist diese Delay Funktion gleichermaßen sicher in beliebigen Threads ohne Messagequeues oder dem MainThread einer Anwendung benutztbar.
In einem abgespalteten Thread der kein Messagequeue besitzt verhält sich Delay() so wie Sleep().
In einem Thread mit Messagequeue, z.b. Hauptthread, würde die meiste Zeit der Thread schlafen und nur wenn tatsächlich Messages vorliegen, diese per Application.ProcessMesages abgearbeitet. Da Application.ProcessMessages per PeekMessage() und GetMessage() ein Polling realisiert verbraucht ein unnötiger Aufruf dieser Funktionen mehr CPU Zeit.
Mit obiger Funktion stellen wir um vom Polling auf Ereignisorientiert.
Gruß Hagen
[edit=Chakotay1308] Mfg, Chakotay1308[/edit]
[edit=Matze]"Exit"-Zeile hinzugefügt. Mfg, Matze[/edit]