AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Delay

Ein Thema von negaH · begonnen am 17. Jul 2003 · letzter Beitrag vom 28. Nov 2010
Antwort Antwort
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
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

AW: Delay in Delphi

  Alt 28. Nov 2010, 09:13
Und noch eine Variante (NonVCL):

Delphi-Quellcode:
procedure Delay(msecs: Longint);
var
  targettime: Longint;
  Msg: TMsg;
begin
  targettime := GetTickCount + msecs;
  while targettime > GetTickCount do
    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;
end;
Thomas
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2014 by Daniel R. Wolf