Wozu bitte einen eigenen Timer erstellen?
Und klar, daß die Last auf 100% hoch geht, schließlich führst du dort eine "schnelle" Schleife aus,
wo STÄNDIG dieses "
if (systime+1000)<=GetTickCount then begin" ausgeführt wird.
für dein Probleme würde sich ein Sleep eignen, was die CPU-Last begrenzt:
Delphi-Quellcode:
procedure TForm1.Timer(dauer: integer);
var systime,zaehler: integer;
begin
zaehler:=0;
systime:=GetTickCount;
while dauer>zaehler do
begin
if (systime+1000)<=GetTickCount then begin
Inc(zaehler);
ListBox1.Items.Add(InttoStr(zaehler)); //zum test der ausgabe
systime:=GetTickCount;
end else Sleep(10);
//Application.ProcessMessages;
end;
end;
wobei eigentlich auch dieses ausreicht:
Delphi-Quellcode:
procedure TForm1.Timer(dauer: integer);
var systime,zaehler: integer;
begin
zaehler:=0;
systime:=GetTickCount;
while dauer>zaehler do
begin
Sleep(1000);
Inc(zaehler);
ListBox1.Items.Add(InttoStr(zaehler)); //zum test der ausgabe
//Application.ProcessMessages;
end;
end;
[add]
ohne
Application.ProcessMessages; entspräche beides deiner bisherigen Funktionsweise, nur ohne die 100% CPU-Last.
[/add]
[add2]
jo. das gute alte Delay gibt's ja och noch
Delphi-Quellcode:
procedure TForm1.Timer(dauer: integer);
var systime,zaehler: integer;
begin
zaehler:=0;
systime:=GetTickCount;
while dauer>zaehler do
begin
Delay(1000);
Inc(zaehler);
ListBox1.Items.Add(InttoStr(zaehler)); //zum test der ausgabe
end;
end;
[/add2]
aber nochmal wozu einen eigenen Timer, wo es doch eine fertige Komponente gibt, welche nicht ständig vegleich durchführt.
Delphi-Quellcode:
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private-Deklarationen }
Timer1Count: Integer;
procedure Timer(dauer: integer);
end;
procedure TForm1.Timer(dauer: integer);
begin
Timer1Count := dauer div Timer1.Intervall;
Timer1.Enabled := True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Tag := Timer1.Tag + 1;
If Timer1.Tag >= Timer1Count Then Timer1.Enabled := False;
ListBox1.Items.Add(IntToStr(Timer1.Tag)); //zum test der ausgabe
end;
[edit]
jupp, das mit
Application.ProcessMessages; ist keine schlechte Idee, denn solange deine Timer-Prozedur läuft, ist die
VCL gesperrt.