Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Timer langsamer als Timer ? (https://www.delphipraxis.net/124274-timer-langsamer-als-timer.html)

MaToBe 17. Nov 2008 21:44


Timer langsamer als Timer ?
 
Hallo, ich bins mal wieder

Folgendes Problem:

Ich habe einen Timer, der zählt die Zeit, bis das nächste Bild angezeigt wird.
Ein zeiter Timer rechnet mit dieser Zeit und steuert die ProgressBar.

Timer 1 für die Bilder:
Delphi-Quellcode:
procedure TForm1.tZeitTimer(Sender: TObject);
var
  AuswahlBild : string;
  AuswahlNummer : integer;
begin
    repeat
        AuswahlNummer := Random(clbBilder.Count);
    until clbBilder.Checked[AuswahlNummer] = true;
    AuswahlBild := sgDaten.Cells[2,AuswahlNummer];
    ChangeWallpaper(AuswahlBild);
end;
Timer 2 für die ProgressBar:
Delphi-Quellcode:
procedure TForm1.tProgressBarTimer(Sender: TObject);
begin
   if pgbZeit.Position = pgbZeit.Max then
   begin
      p := 0;
      pgbZeit.Position := p;
   end
   else
      begin
         p := p + 100;
         pgbZeit.Position := p;
      end;
end;
Aufgerufen werden beite gleichzeitig hier:
Delphi-Quellcode:
procedure TForm1.btnStartClick(Sender: TObject);
begin
    if cbZeit.Checked = true then
    begin
         if edtZeit.Text <> '' then
         begin
            lbStatus.Caption := 'Aktiv';
            lbStatus.Font.Color := clLime;
            tZeit.Interval := (strtoint(edtZeit.Text)*1000);
            pgbZeit.Max := (strtoint(edtZeit.Text)*1000);
            p := 0;
            tProgressBar.Enabled := true;
            tZeit.Enabled := true
         end
         else ShowMessage ('Sie haben keine Zeit eingegeben.');
    end;
end;
Frage: Warum geschieht der Bildwechsel immer viel früher als das die ProgressBar am Ende ankommt?

alzaimar 17. Nov 2008 21:46

Re: Timer langsamer als Timer ?
 
Timer sind nicht genau. Anstatt im Interval immer eine Konstante zu addieren, solltest Du lieber die zeitliche Differenz zu einem Startwert verwenden.

Cyberstorm 17. Nov 2008 22:01

Re: Timer langsamer als Timer ?
 
und das geht mit der funktion
Delphi-Quellcode:
GetTickCount
("Retrieves the number of milliseconds that have elapsed since the system was started.")

MaToBe 17. Nov 2008 22:17

Re: Timer langsamer als Timer ?
 
mmh also ich glaube (nicht wissend) das ich verstanden habe was ihr mit "zeitliche Differenz zum Startwert" meint.

Allerdings hab ich keine Ahung wie genau man das jetzt umsetzt.

Also ich soll mit GetTickCount immer mein P vergrößern?

SirThornberry 17. Nov 2008 22:38

Re: Timer langsamer als Timer ?
 
du holst du zu Beginn den Startwert mit GetTickCount (Variable1). Wenn du später im Timer wieder die Zeit mit GetTickCount aufrufst (Variable2) kannst du die vergangene Zeit in Millisekunden mit Variable2 - Variable1 berechnen.

Cyberstorm 17. Nov 2008 22:41

Re: Timer langsamer als Timer ?
 
war ich wohl zu langsam. ich lass dne beitrag mal trotzdem drin wegen dem codeschnipsel :P

du weist am "anfang" einer variablen den rückgabewert von GetTickCount zu.

danach kannst du, indem du den aktullen GetTickCOuntWert abziehst die vergangende Zeit in millisekunden erhalten:

Delphi-Quellcode:
var
  a: DWord;
begin
  a:=GetTickCount;
  [...CODE...]
  Showmessage('Es sind ' + IntToStr(GetTickCount - a) + ' ms vergangen...)
end;

Sir Rufo 18. Nov 2008 00:05

Re: Timer langsamer als Timer ?
 
Warum denn nicht so?
Delphi-Quellcode:
procedure TForm1.tGlobalTimerTimer(Sender: TObject);
var
  AuswahlBild : string;
  AuswahlNummer : integer;
begin
  if pgbZeit.Position = pgbZeit.Max
  then
    begin

      // Bild austauschen

      repeat
        AuswahlNummer := Random( clbBilder.Count );
      until clbBilder.Checked[ AuswahlNummer ] = true; // <--- das = true kannst du dir hier sparen
      AuswahlBild := sgDaten.Cells[ 2, AuswahlNummer ];
      ChangeWallpaper( AuswahlBild );

      // ProgressBar zurücksetzen

      p := 0;
      pgbZeit.Position := p;
    end
  else
    begin
      p := p + 100;
      pgbZeit.Position := p;
    end;
end;
Dann hast du nur einen Timer und die Wechsel sind absolut synchron mit der ProgressBar.
Da kann es Dir auch egal sein, wie falsch der Timer geht :mrgreen:

cu

Oliver

MaToBe 18. Nov 2008 14:18

Re: Timer langsamer als Timer ?
 
wow cool stimmt :cyclops: warum komm ich auf sowas nicht :wall:

ja mit dem timer ist es egal den keinem fällt auf ob das Bild jetzt 1 Sekunde früher oder später wechselt bei einer durchschnittlichen Dauer von 5 Minuten :zwinker:

Danke auch fürs verbessern von den Schöhnheitsfehlern =)

MFG MaToBe

Sir Rufo 18. Nov 2008 14:32

Re: Timer langsamer als Timer ?
 
you're welcome


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 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