AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Pause in Timer setzen

Ein Thema von TeTSuO · begonnen am 24. Apr 2005 · letzter Beitrag vom 11. Okt 2017
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von TeTSuO
TeTSuO

Registriert seit: 26. Feb 2005
Ort: Ludwigshafen am Rhein
60 Beiträge
 
Delphi 7 Enterprise
 
#1

Pause in Timer setzen

  Alt 24. Apr 2005, 14:42
Hallo erstma!

Gibt es eine Timer-Komponente die so ne art Pause eigenschaft hat.

Wenn jetzt zum Beispiel mein Timer ein Interval von 20 Sekunden hat und ich drücke nach 15 sekunden pause soll der Timer angehalten werden. Wenn ich dann wieder auf Play drücke soll dieser fortgesetzt werden, aber nur noch 5 sekunden bis zum nächsten interval.

Wenn jemand eine Komponente kennt oder einen Vorschlag hat wie ich das realiesieren könnte wäre ich echt dankbar!
”Wer immer nur das tut was er schon kann, wird immer das bleiden was er schon ist”

DiaSchau
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: Pause in Timer setzen

  Alt 24. Apr 2005, 14:45
ich weiss nicht ob das mit Enable geht, musst du halt probieren.

EDIT..
Geht nicht.
Du könntest eine Timer mit Interval = 1000 einsetzen und in OnTimer eine Var erhöhen.

So in etwa

Delphi-Quellcode:
var
  n:integer =0 ;
  erlaubt : boolean = true;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if erlaubt then
 begin
  Inc(n);
  if n > 15 then n:=0;
 end;
end;

// pause button
procedure TForm1.Button1Click(Sender: TObject);
begin
 erlaubt := not erlaubt;
end;
// oder etwas umstendlicher....
// pause button 2
procedure TForm1.Button1Click(Sender: TObject);
begin
 if not Assigned(timer1.OnTimer) then
       Timer1.OnTimer := Timer1Timer
       else
       Timer1.OnTimer := nil;
end;
Und dann musst du nur noch n abfragen.
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#3

Re: Pause in Timer setzen

  Alt 24. Apr 2005, 14:48
Bau dir doch nen eigenen Timer. Ne Schleife, GetTickCount und Application.ProcessMessages sollten die Sachen sein, die du brauchst.

MfG Pr0g
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Pause in Timer setzen

  Alt 24. Apr 2005, 14:52
wenn du "enabled" beim Timer auf "false" setzt hält er an. Das heißt du musst in deinem OnTimer-Event und beim manuellen starten des Timer einfach dir die Zeit merken. Dementsprechend kannst du dann beim nächsten start ausrechnen wieviel Sekunden der Timer noch zu laufen hat.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von TeTSuO
TeTSuO

Registriert seit: 26. Feb 2005
Ort: Ludwigshafen am Rhein
60 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Pause in Timer setzen

  Alt 24. Apr 2005, 15:37
Danke für eure Vorschläge.

Werde wie Pr0g meint eine selber schreiben.
Wollte eigentlich keine Kompo schreiben wenn's aber keine gibt werde ich das wohl machen (müssen).
Aktualisiere diesen Thread wenn ich die Kompo fertig habe. Stelle diese dann zur Verfügung wenn jemand interesse hat.
”Wer immer nur das tut was er schon kann, wird immer das bleiden was er schon ist”

DiaSchau
  Mit Zitat antworten Zitat
Benutzerbild von TeTSuO
TeTSuO

Registriert seit: 26. Feb 2005
Ort: Ludwigshafen am Rhein
60 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Pause in Timer setzen

  Alt 2. Jul 2006, 11:44
Nachdem ich einiges anderes zu programieren hatte habe ich es auch nun geschafft einen Timer zu programmieren der mit PauseTimer.Pause angehalten und mit PauseTimer.Resume fortgesetzt werden kann ohne das der timer nochmal die gesamte Intervalzeit benötigt

Wer's braucht kann sich's runterladen
Angehängte Dateien
Dateityp: rar pausetimer_135.rar (1,1 KB, 72x aufgerufen)
”Wer immer nur das tut was er schon kann, wird immer das bleiden was er schon ist”

DiaSchau
  Mit Zitat antworten Zitat
Baerlemann

Registriert seit: 5. Aug 2015
2 Beiträge
 
Delphi 7 Professional
 
#7

AW: Pause in Timer setzen

  Alt 6. Okt 2017, 09:56
Hier eine nachbearbeitete Version zur Vermeidung "eingefrorener" Zustand,
mit dem ich in meiner Applikation zu kämpfen hatte.

Delphi-Quellcode:
// 2015-08-26 - Rev.2.0.6.1
// * !HOT BUGFIX! procedure TPauseTimer.Resume:
// - Ursache für sporadisch "eingefrorener" Timer gefunden
// - Finterval hat dann Wert $FFFFFFF<x> (In Eventlog Resume -> SetInterval)
// - Daher zusätzlichen Check eingebaut ob FInterval > FMainInterval ist
// - Bisheriger Check auf "0" geändert auf ResumeIntervalValue < 100
// zur Vermeidung zu kleine Rest Intervallzeit bis nächsten Timer Event
// - Kommt einer dieser beiden Fälle vor, wird FInterval zurückgesetzt
// auf FMainInterval Wert
//---------------------------------------------------------------------------------------------------------
// 2015-08-21 - Rev.2.0.5.1
// * !WICHTIGER BUGFIX! procedure TPauseTimer.Resume:
// - Check eingebaut of ResumeIntervalValue den Wert 0 erhält
// ResumeIntervalValue := FInterval - (FPauseTime-FStartTime);
// Bei "Value = 0" muss hier "Value <> 0" eingestellt werden
// Es wird "Value := 50" eingestellt = 50msec bis nächster TimerEvent
// Bei "Value = 0" wird der Timer NICHT mehr neu gestartet !!!
// (Siehe "SetInterval -> UpdateTimer")
// --> Timersteuerung bleibt dann stehen !!
// !NACHTRAG! Das ist nicht der Grund für "eingefrorenen" Timer
// (siehe HOT Bugfix 2015-08-26)
//---------------------------------------------------------------------------------------------------------
// 2015-08-05 - Rev.2.0.1.1
// !NEU! Dieser Timer wird ab sofort als ZENTRALER "RatePBPauseTimer" genutzt !
// TimerKomponente die mit PAUSE/RESUME angehalten werden kann
// läuft dann weiter mit dem zwischengespeicherten Wert
// Vorlage kopiert von:
// "http://www.delphipraxis.net/44768-pause-timer-setzen.html"
//========================================================================================================
unit PauseTimer;

interface

uses
  SysUtils, Classes, Windows, Forms, ExtCtrls, Messages;

type
  TPauseTimer = class(TComponent)
  private
    m_CalledFromWhere : string;
    m_CalledFromMain : string;
    FInterval,
    FMainInterval,
    FStartTime,
    FPauseTime: Cardinal;
    FWindowHandle: HWND;
    FOnTimer: TNotifyEvent;
    FEnabled: Boolean;
    procedure UpdateTimer;
    procedure SetEnabled(Value: Boolean);
    procedure SetMainInterval(Value: Cardinal);
    procedure SetInterval(Value: Cardinal);
    procedure SetOnTimer(Value: TNotifyEvent);
    procedure WndProc(var Msg: TMessage);
  protected
    procedure Timer; dynamic;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Delay: Cardinal read FInterval;
    property Enabled: Boolean read FEnabled write SetEnabled default True;
    property Interval: Cardinal read FMainInterval write SetMainInterval default 1000;
    property OnTimer: TNotifyEvent read FOnTimer write SetOnTimer;
    procedure Pause;
    Procedure Resume;
  end;

//procedure Register;

implementation


constructor TPauseTimer.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FEnabled := True;
  FMainInterval := 1000;
  FInterval := 1000;
  FPauseTime := 0;
  FStartTime := 0;
  FWindowHandle := Classes.AllocateHWnd(WndProc);
end;

destructor TPauseTimer.Destroy;
begin
  m_CalledFromWhere := 'Destroy';
  FEnabled := False;
  UpdateTimer;
  Classes.DeallocateHWnd(FWindowHandle);
  inherited Destroy;
end;

procedure TPauseTimer.WndProc(var Msg: TMessage);
begin
  with Msg do
  begin
    if Msg = WM_TIMER then
    begin
      try
        Timer;
      except
        Application.HandleException(Self);
      end;
    end else
    begin
      Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
    end;
  end; //with Msg
end;

procedure TPauseTimer.UpdateTimer;
const FunctionName = 'TPauseTimer.UpdateTimer';
begin
  KillTimer(FWindowHandle, 1);
  if (FInterval <> 0) and FEnabled and Assigned(FOnTimer) then
  begin
    if SetTimer(FWindowHandle, 1, FInterval, nil) = 0 then
    begin
      raise EOutOfResources.Create('Timer Error');
    end;
    FStartTime:=GetTickCount;
  end;
end;

procedure TPauseTimer.SetEnabled(Value: Boolean);
begin
  m_CalledFromWhere := m_CalledFromMain + ' -> SetEnabled';
  if Value <> FEnabled then
  begin
    FEnabled := Value;
    UpdateTimer;
  end;
end;

procedure TPauseTimer.SetInterval(Value: Cardinal);
begin
  m_CalledFromWhere := m_CalledFromMain + ' -> SetInterval';
  if Value <> FInterval then
  begin
    FInterval := Value;
    UpdateTimer;
  end;
end;

procedure TPauseTimer.SetMainInterval(Value: Cardinal);
begin
  FMainInterval := Value;
  FPauseTime := 0;
  m_CalledFromMain := 'SetMainInterval';
  SetInterval(Value);
  m_CalledFromMain := 'N/A';
end;

procedure TPauseTimer.SetOnTimer(Value: TNotifyEvent);
begin
  m_CalledFromWhere := 'SetOnTimer';
  FOnTimer := Value;
  UpdateTimer;
end;

procedure TPauseTimer.Timer;
begin
  m_CalledFromWhere := 'Timer';
  if Assigned(FOnTimer) then
  begin
    FInterval:=FMainInterval;
    FOnTimer(Self);
    UpdateTimer;
  end;
end;

procedure TPauseTimer.Pause;
begin
  if not FEnabled then Exit;
  FPauseTime:=GetTickCount;
  m_CalledFromMain := 'Pause';
  SetEnabled(False);
  m_CalledFromMain := 'N/A';
end;

procedure TPauseTimer.Resume;
const FunctionName = 'TPauseTimer.Resume';
var ResumeIntervalValue : Cardinal;
begin
  if FEnabled then Exit;
  if FPauseTime <> 0 then
  begin
    ResumeIntervalValue := FInterval - (FPauseTime-FStartTime);
    //******************************************************************************
    // !BUGFIX! Bei "Value = 0" muss "Value <> 0" eingestellt werden
    // Sonst wird in "SetInterval -> UpdateTimer" der Timer NICHT mehr gestartet !!!
    // RTHA 2015-08-25 - Check geändert "Value = 0" ==> "Value < 100"
    // Vermeidung zu kleine Rest Intervallzeit bis nächsten Timer Event
    // ResumeIntervalValue := 100 --> 100 msec bis nächsten Timer Event
    //******************************************************************************
    // !BUGFIX! 2. Ursache für "eingefrorenen" Timer gefunden
    // ResumeIntervalValue wird sporadisch mit Wert $ FFFF FFF<x> (Hex) belegt ??!!
    // Timer wird zwar wieder gestartet jedoch mit dieser extrem langen Laufzeit
    // Damit Eindruck eingefrorener Zustand !!!
    // Typ Cardinal = 32 Bit OHNE Vorzeichen !
    // Check eingebaut of ResumeIntervalValue > FMainInterval geworden ist
    // --> Dann ResumeIntervalValue auf FMainInterval setzen
    //******************************************************************************
    if (ResumeIntervalValue < 100) or
       (ResumeIntervalValue > FMainInterval) then
    begin
      ResumeIntervalValue := FMainInterval; // !! RESET auf FMainInterval Wert !!
    end;
    m_CalledFromMain := 'Resume';
    SetInterval(ResumeIntervalValue); // FEnabled ist hier noch "FALSE" bei vorheriger PAUSE
    m_CalledFromMain := 'N/A';
    FPauseTime:=0;
  end;
  m_CalledFromMain := 'Resume';
  SetEnabled(True);
  m_CalledFromMain := 'N/A';
end;

//procedure Register;
//begin
// RegisterComponents('User Tools', [TPauseTimer]);
//end;

end.
  Mit Zitat antworten Zitat
Monday

Registriert seit: 24. Aug 2012
103 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Pause in Timer setzen

  Alt 6. Okt 2017, 16:53
Hätte man nicht auch mit einem zweiten Timer arbeiten können? Wenn der erste Pausieren soll, dann wird Timer1 deaktiviert, Timer2 (Pausentimer) aktiviert und nach abgelaufender Zeit deaktiviert sich Timer2 selbst und aktiviert Timer 1 wieder. ?
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Pause in Timer setzen

  Alt 11. Okt 2017, 10:27
UpdateTimer sollte vor FOnTimer() aufgerufen werden, sonst verfälschen lange Laufzeiten der OnTimer-Methode die Genauigkeit.
Delphi-Quellcode:
    UpdateTimer;
    FOnTimer(Self);
Da Windows-PCs manchmal auch über mehrere Tage laufen, besser mit GetTickCount64() arbeiten.
http://www.delphipraxis.net/711170-post5.html
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#10

AW: Pause in Timer setzen

  Alt 11. Okt 2017, 10:43
Von welcher Beschränkung genau sprichst du?

Meinst du, dass man Dax's GetTickCount64-Code auch unter XP verwenden kann? Kann man Winapi.Windows.GetTickCount64 nicht unter XP verwenden?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:25 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