Home » Tipps & Tricks » System » Prozesse » Anwendung für eine bestimmte Zeit pausieren

Anwendung für eine bestimmte Zeit pausieren

Mit der Funktion Sleep wird die Ausführung des aktuellen Threades unterbrochen. Als Parameter übergibt man die Anzahl der Millisekunden, die der Thread temporär unterbrochen werden soll.

procedure TForm1.Button1Click(Sender: TObject);
begin
  { bei einer Singlethreaded-Anwendung würde
    diese für etwa 1 Sekunde still stehen }
  Sleep(1000);
end;

Wird Sleep im Hauptthread der Anwendung aufgerufen, so befindet sich die gesamte Anwendung anschließend im Ruhezustand und es werden in diesem Zeitraum weder Nachrichten noch Befehle abgearbeitet.Das bedeutet, dass die gesamte Anwendung still steht und nicht mehr reagiert.Gefährlich wird die ganze Sache, wenn andere Anwendungen mit der eigenen Botschaften austauschen und auf dessen Verarbeitung warten. Dies führt dann unweigerlich zum Deadlock und kann große Teile des Systemes lahmlegen, wenn die Anwendungen untereinander kommunizieren, sich aber im Wartezustand befinden. Um dieses Problem zu umgehen sollte man dafür sorgen, dass die Botschaftswarteschlange trotz Unterbrechnung abgearbeitet wird.Dieses kann man durch die Methode „ProcessMessages“ des Applikationsobjektes durchführen.

procedure Delay(const Milliseconds: DWord);
var
  FirstTickCount: DWord;
begin
  FirstTickCount := GetTickCount;
  while ((GetTickCount - FirstTickCount) < Milliseconds) do
    Application.ProcessMessages;
end;

In diesem Beispiel hängt die Anwendung die übergebenen Millsekunden lang in der Schleife fest und arbeitet in dieser Zeit die Botschaftswarteschlange ab. Dies ist aber nur für sehr kurze Pausen geeignet, da ansonsten die CPU-Nutzung stark ansteigt.Ein besseres Ergebnis erreicht man mit folgendem Code:

procedure Delay(const Milliseconds: DWord);
var
  FirstTickCount: DWord;
begin
  FirstTickCount := GetTickCount;
  while ((GetTickCount - FirstTickCount) < Milliseconds) do
  begin
    Application.ProcessMessages;
    Sleep(0);
  end;
end;

Durch den Einbau von Sleep(0) verzichtet der aktuelle Thread auf den Restbetrag der Zeitscheibe, die ihm durch den Kernel zur Verfügung gestellt wird. Diese Restzeit wird anderen Threads identischer Priorität zur Verfügung gestellt. Benötigt kein anderer Thread diese Rechenzeit, kehrt die Funktion sofort zurück.Hinweise zur Benutzung:Die Auflösung von Sleep unterscheidet sich zwischen den unterschiedlichen Betriebssystemen. Unter NT-basierenden Systemen werden etwa 10ms Sekunden garantiert, während es auf Systemen mit Win9x etwa 55ms sind.Des Weiteren muss man davon ausgehen, dass die übergebene Zeit nur die Mindestwartezeit ist. Deshalb sollte Sleep nicht zu Zeitmessungen verwendet werden.