Thema: Delphi Delay

Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#1

Delay

  Alt 17. Jul 2003, 03:19
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]

Geändert von fkerber (28. Nov 2010 um 09:58 Uhr) Grund: Zusammenführung unterschiedlicher Delay-Varianten
  Mit Zitat antworten Zitat