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
Antwort Antwort
bumpelwumpel

Registriert seit: 19. Feb 2009
8 Beiträge
 
#1

Eigenen Timer schreiben

  Alt 19. Feb 2009, 12:30
Hi,

ich möchte für ein Programm eine Timer schreiben.
Dafür will ich die GetTickCount Funktion nutzen. Nur funktioniert es irgendwie nicht richtig.

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;
  end;
end;
Das Programm scheint die Schleife auszuführen, aber die CPU Auslastung geht auf 100% und das Programm reagiert für die in der Variablen "dauer" nicht mehr.
Wenn die Zeit abgelaufen ist, bringt das Programm die Testausgabe auf einen Schlag.

Was läuft bei dieser Schleife schief?

Und ich hab nochmal eine Frage. Wie kann ich den Timer deklarieren, dass das Programm ihn aufrufen kann und dann für die mitgegebene Zeitdauer pausiert?

mfg bumpelwumpel
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Eigenen Timer schreiben

  Alt 19. Feb 2009, 12:37
Hi,

Es läuft nichts schief, aber du solltest in jedem Schleifendurchlauf

Application.ProcessMessages; aufrufen.

Allerdings ist das keine gute Umsetzung für einen Timer find ich...
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 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
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Eigenen Timer schreiben

  Alt 19. Feb 2009, 12:46
Und schwuppdiwup (Application.Processmessages+sleep) sind wir wieder bei Hagens Delay und der Frage warum nicht ein Timer-Event.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
bumpelwumpel

Registriert seit: 19. Feb 2009
8 Beiträge
 
#5

Re: Eigenen Timer schreiben

  Alt 19. Feb 2009, 13:02
Zitat von himitsu:

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.Interval; //<-- Wozu die Dauer durch das Interval teilen?
  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;
Hey, danke.
Nun ich wollte mal ausprobieren wie man einen Timer machen könnte.
Das mit Application.Processmessages funktioniert gut doch ich benutz doch lieber den internen Timer. (Ich hatte mal ziemliche Probleme mit ihm, deshalb wollte ich ihn nicht benutzen. Doch der Code von himitsu funktioniert.)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Eigenen Timer schreiben

  Alt 19. Feb 2009, 13:13
Zitat:
Wozu die Dauer durch das Interval teilen?
Wenn du Intervall auf 1000 stellt, dann entspräche dieses deiner alten Funktion.

da wird ja alle etwa einer Sekunde was in's Memo geschrieben und das für die Zeit von Dauer ... also (Dauer / 1000) Mal.

für die Dauer hab ich hier einfach mal die Intervalldauer des Timers genommen

Es wird also Timer1Count Mal in Timer1.Intervall-Millisekunden-Intervallen das Ereignis ausgeführt,
also Timer1Count * Timer1.Intervall, was wiederum etwa Dauer entspricht.


PS: TTimer nutzt intern nur einen Windows-Timer, welcher dem Programm bzw. der TTimer-Komponente, alle Timer.Intervall Millisekunden, eine Windowsbotschaft (Message) schickt.

Heißt die Komponente hat eigentlich nicht viel zu tun und produziert deshalb fast keine CPU-Belastung.


Was hattest du denn mal für Probleme mit TTimer?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz