Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#6

AW: Wird auf procedure gewartet ?

  Alt 23. Okt 2011, 09:11
Timer-Messages sind niederwertig und ich glaub es ist immer nur maximal Eine in der MessageQueue vorhanden ... ist also die selbe Message schonmal drin, wird keine Neue eingetragen.

Bei Start der Ausführung des Timer-Ereignisses wird die aktuelle Message aus der Queue abgefrag und gelöscht.
Wärend der abarbeitung fällt also maximal nur eine weitere Message an, welche auf die nächste Bearbeitung wartet.


[add]
Einen Timer mit einem Intervall von 100 ms.
Delphi-Quellcode:
var
  TimerStart, LastTimer, TimerCalls: Cardinal;

procedure TForm8.Timer1Timer(Sender: TObject);
begin
  if TimerStart = 0 then begin
    TimerStart := GetTickCount;
    LastTimer := TimerStart;
  end;
  Inc(TimerCalls);
  mnQueryText.Lines.Add(Format('%d %.2n %.2n',
    [TimerCalls, (GetTickCount - TimerStart) / 1000, (GetTickCount - LastTimer) / 1000]));
  LastTimer := GetTickCount;
  if TimerCalls = 100 then begin
    mnQueryText.Lines.Add('start');
    Sleep(10000);
    mnQueryText.Lines.Add('ende');
  end;
  if TimerCalls = 300 then
    Timer1.Enabled := False;
end;
Würden Ereignisse parallel ablaufen, dann würden Diese zwischen Start und Ende stehen.
Würden sich Ereignisse ansammeln/aufhäufen, dann würden nach dem Ende 100 Einträge (Pause durch Intervall) ganz schnell auftachen, da sie alle abgearbeitet würden.

Und zugleich sieht man, daß diese Timer relativ ungenau sind, denn die Zeit läuft dem Zähler voraus,
da der Zähler der Zeitanzeige hinterherläuft.
Würde es synchron/genau laufen, wäre ja die Zeit immer etwa ein Zehntel des Zählers.


Alternativ mal statt
Delphi-Quellcode:
    Memo1.Lines.Add('start');
    Sleep(10000);
    Memo1.Lines.Add('ende');
Folgendes ausprobieren.
Delphi-Quellcode:
    Memo1.Lines.Add('start');
    for i := 1 to 200 do begin // 200 * 50 = 10000
      Sleep(50);
      Application.ProcessMessages;
    end;
    Memo1.Lines.Add('ende');
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Okt 2011 um 09:46 Uhr)
  Mit Zitat antworten Zitat