Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

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

AW: Delay zu langsam?

  Alt 17. Jun 2010, 19:24
Hi

in deinem Test hast du meine Delay() Funktion ausgeklammert. Ich nehme also an du hast das mal so getestet das du das Sleep(10) auskommentierst und stattdessen mein Delay(10) aktiviert hast ? Wenn dem so ist ist die Frage ob du das nachfolgende Application.ProcessMessages ebenfalls auskommentiert hast ? Wenn nicht ist dein "Performancevergleich" falsch da mein Delay() ja schon .ProcessMessages enthält und mit einem weiteren externen Aufruf von .ProcessMessages wird dieser Perfromancevergleich stark verfälscht da dann das 2. .ProcessMessages erstmal darauf wartet das überhaupt Messages im Queue sind.

Deine Schleife mit 500*Sleep(10) sollte 5000ms dauern. Da du aber noch zusätzlich Applikation.ProcessMessages aufrufst und damit quasi den Messagequeue unötigt pollst, sollte eigentlich deine Variante wesentlich ungenauer sein. Dh. deine Variante sollte minimal 5 Sekunden + X andauern.

Die von mir entwickelte Delay() Funktion gehat da ganz anders vor:
1.) sie benutzt ein "totes" Event das niemals signalisiert und wartet mit einem Timeout auf eingehende Messages.
2.) dadurch wird über OS Funktionen erreicht da der aktuelle Thread komplett schlafen gelegt wird und somit keinerlei Systemperformance unsinnig verbraucht
3.) sollte nun eine Messages schon vor dem Timeout eintreffen kehrt mein Delay() in der innersten Schleife zurück und bearbeitet über .ProcessMessages diese Nachrichten
4.) danach wird die restliche Wartezeit neu berechnet und damit enthält die Gesamtwartezeit dieses Delay() auch die Abarbeitungszeit für .ProcessMessages
5.) das führt dazu das die zusätzliche Zeit die man für .ProcessMessages verbraucht nicht wie bei deinem Delay() oben drauf auf die Gesamtwartezeit addiert wird

Ich würde mal davon ausgehen das du einen fehlerhaften Vergleich angestellt hast und dein Application.ProcessMessages nicht auskiommentiert hast wenn du mein Delay() benutzt.

Der Vergleich sähe also so aus:
Delphi-Quellcode:
procedure Test;
var
  I: Integer;
  T: cardinal;
begin
  T := GetTickCount;
  for I := 0 to 499 do
  begin
    Sleep(10);
    Application.ProcessMessages;
  end;
  T := GetTickCount - T;
  ShowMessage('Dein Delay = ' + IntToStr(T) + 'ms');

  T := GetTickCount;
  Delay(5000);
  T := GetTickCount - T;
  ShowMessage('Mein Delay = ' + IntToStr(T) + 'ms');

end;
So wäre es ein korrekter und vergleichbarer Test beider Funktionen.

Übrigens die Abfrage "if Application.Terminated then Exit" hat einen sehr wichtigen Grund.

Und Sleep(10) ist im Grunde fast schon witzlos da die Zeitscheiben des Windows OS meisten >= 20ms sind, soll heisen Windows kann sowas garnicht korrekt zeitlich auflösen.

Gruß Hagen
  Mit Zitat antworten Zitat