AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delay zu langsam?

Ein Thema von Schorschi5566 · begonnen am 17. Jun 2010 · letzter Beitrag vom 17. Jun 2010
 
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, 18: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
 


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 · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz