AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eigenen Timer schreiben

Ein Thema von bumpelwumpel · begonnen am 19. Feb 2009 · letzter Beitrag vom 19. Feb 2009
 
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz