Thema: Delphi Eigenen Timer schreiben

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

Re: Eigenen Timer schreiben

  Alt 19. Feb 2009, 12:41
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat