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');