Ja genau, TTimer in
VCL. Das ist ganz merkwürdig. Hab ich so auch noch nie erlebt. Zur Reproduktion des Fehlers habe ich ein ganz einfaches Testprogramm gebastelt:
Delphi-Quellcode:
unit Unit5;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
Vcl.ExtCtrls;
type
TForm1 =
class(TForm)
Timer1: TTimer;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private-Deklarationen }
FCounter: Integer;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FCounter:= 0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Inc(FCounter);
Timer1.Enabled:= TRUE;
Timer1.Enabled:= FALSE;
Timer1.Enabled:= TRUE;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Caption:= IntToStr(FCounter);
Timer1.Enabled:= FALSE;
end;
end.
Die dreifache Wertänderung habe ich gemacht um sicher zu gehen, dass in jedem Fall eine Wertänderung eintritt, egal wie Timer1.Enabled im Moment des Buttonclicks besetzt ist. Das Intervall lasse ich auf den standardmäßigen 1000 ms.
Normalerweise müsste sich die Zahl im Fenstercaption immer exakt 1 Sekunde nach dem Buttonclick um 1 erhöhen. Tatsächlich aber scheint es ein Zufallswert zwischen 0 und 1000 ms zu sein.
Jetzt hatte ich auch zuerst Windows im Verdacht. Also virtuelle Maschine geöffnet, da ist ein Win 10 drauf (Host = Win 7). Gleicher Effekt. Jetzt kommts aber: Gehe ich mit der selben EXE auf einen anderen physischen Rechner, läuft es ganz normal.
Jetzt würde mich mal interessieren, wie Windows den Timer bzw. GetTickCount realisiert. Soweit ich weiß sollte das doch ein mehr oder weniger "geeichtes" Signal aus einem Quarz auf dem Mainboard sein, oder? Wenn der einen an der Marmelade hätte, müsste doch auch die Systemzeit aus dem Ruder laufen, und zwar auffallend stark. Die aber scheint keine Probleme zu haben. Selbst dann nicht, wenn ich ein Live-Linux von DVD starte.