Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

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 stoppen (https://www.delphipraxis.net/108997-timer-stoppen.html)

DelphiManiac 22. Feb 2008 15:09


Timer stoppen
 
Hallo

ich habe folgendes Problem:

ich nutze eine Timer um zyklisch Werte aus einem Gerät zu holen (ja ich weiß, ein Thread wäre hier vielleicht angebrachter :-))
das klappt ja auch, mein Problem ist nun, das ich innerhalb meines Timers Application.ProcessMessages aufrufen muss,
damit die Form weiter bedienbar bleibt.

Jetzt will ich den Timer ja auch mal beenden:

Delphi-Quellcode:
meinTimer.enabled:=false;
Z.b.: wenn ich die Verbindung zur Schnittstelle beende.
Dann will ich auch mein Objekt freigeben:

Delphi-Quellcode:
MeinGeraet.Free;

Timerprozedur:
Delphi-Quellcode:
procedure TMainGUI.tmrAblaufTimer(Sender: TObject);
begin
  MeinGeraet.HoleDies;
  Application.ProcessMessages; // angenommen mein Obj ist schon freigegeben (dann knallts)
  MeinGeraet.HoleJenes;
  Application.ProcessMessages;
  MeinGeraet.HoleDas;
end;
In meinem Disconnect Button mach ich folgendes:

Delphi-Quellcode:
begin
  meinTimer.enabled:=false; // Timer soll beendet werden
 // Wie kann ich sicher gehen, dass der Timer nicht mehr aktiv ist, d.h. auch keine Timerprozedur mehr ausgeführt wird????
  MeinGeraet.Free;
end;
Ich brauch hier eine Synchronisationsmethode, um auf das Ende vom der Timerprozedur zu warten, wie kann ich das machen???

Danke euch!
end;

gmc616 22. Feb 2008 15:16

Re: Timer stoppen
 
Vielleicht so?

Timerprozedur:
Delphi-Quellcode:
procedure TMainGUI.tmrAblaufTimer(Sender: TObject);
begin
  if MeinGereat <> nil then
  begin
    MeinGeraet.HoleDies;
    Application.ProcessMessages;
    MeinGeraet.HoleJenes;
    Application.ProcessMessages;
    MeinGeraet.HoleDas;
  end
end;
Timer soll beendet werden:
Delphi-Quellcode:
begin
  meinTimer.enabled:=false;
//  MeinGeraet.Free;
  FreeAndNil (MeinGeraet);
end;

chest3rs 22. Feb 2008 15:21

Re: Timer stoppen
 
Du kannst aber eine global Variable, z.B.

Delphi-Quellcode:
Enabled : Boolean
und dann im Timer den an der Stelle den Status checken.

Oder ob der Timer.Enabled = True ist. Jedenfalls würde ich noch Bedingungen mit einbringen.

bluesbear 22. Feb 2008 15:24

Re: Timer stoppen
 
Zitat:

Zitat von DelphiManiac
mein Problem ist nun, das ich innerhalb meines Timers Application.ProcessMessages aufrufen muss, damit die Form weiter bedienbar bleibt.

Wenn die Anwendung blockiert, dann liegt das wohl daran, daß sie vor lauter Timer-Event-abarbeiten zu nichts anderem mehr kommt. Kannst du nicht das Timerintervall vergrößern?

Alternativ eine Version ohne Application.ProcessMessages:
Im Form deklarieren:
Delphi-Quellcode:
FtCount : Integer;
und dann
Delphi-Quellcode:
procedure TMainGUI.tmrAblaufTimer(Sender: TObject);
begin
  inc(FtCount);
  case FtCount of
    1 : MeinGeraet.HoleDies;
    2 : MeinGeraet.HoleJenes;
    3 : begin
      MeinGeraet.HoleDas;
      FtCount := 0;
    end;
  end;
end;

DelphiManiac 22. Feb 2008 15:25

Re: Timer stoppen
 
Kann ich denn über Sync-Objekte meine Timerprozedur so absichern,

dass diese Immer nur hintereinander ausgeführt wird?!
Also erst die neue Timerproz ausführen, wenn die alte beendet ist?

DelphiManiac 22. Feb 2008 15:27

Re: Timer stoppen
 
Zitat:

Wenn die Anwendung blockiert, dann liegt das wohl daran, daß sie vor lauter Timer-Event-abarbeiten zu nichts anderem mehr kommt. Kannst du nicht das Timerintervall vergrößern?
Nein das liegt an meiner Methode um Daten zu holen,

hier ist ein Warten auf eine Antwort drin, das verögert meine GUI-Ausführung

SirThornberry 22. Feb 2008 15:31

Re: Timer stoppen
 
was mir bei dem Quelltext auffällt:
Delphi-Quellcode:
procedure TMainGUI.tmrAblaufTimer(Sender: TObject);
begin
  MeinGeraet.HoleDies;
  Application.ProcessMessages; // angenommen mein Obj ist schon freigegeben (dann knallts)
  MeinGeraet.HoleJenes;
  Application.ProcessMessages;
  MeinGeraet.HoleDas;
end;
wenn HoleDies, HoleJenes oder HoleDas etwas länger braucht wird bereits das nächste Timer-Event aufgerufen während bereits im Event etwas abgearbeitet wird.

Daher lieber so:
Delphi-Quellcode:
procedure TMainGUI.tmrAblaufTimer(Sender: TObject);
begin
  TTimer(Sender).Enabled = False;
  MeinGeraet.HoleDies;
  Application.ProcessMessages; // angenommen mein Obj ist schon freigegeben (dann knallts)
  MeinGeraet.HoleJenes;
  Application.ProcessMessages;
  MeinGeraet.HoleDas;
  TTimer(Sender).Enabled = True;
end;

bluesbear 22. Feb 2008 15:41

Re: Timer stoppen
 
Zitat:

Zitat von DelphiManiac
Nein das liegt an meiner Methode um Daten zu holen,
hier ist ein Warten auf eine Antwort drin, das verögert meine GUI-Ausführung

Dann wäre ein Thread wohl wirklich die bessere Lösung. Guck dir nochmal meine erste Message hier an - ich war mit meinem Edit etwas zu langsam. :stupid: Vielleicht ist das ja gut genug.
EDIT: In Kombination mit SirThornberrys Vorschlag. (Das geht mir echt zu schnell hier - ich werde alt :| )

DelphiManiac 22. Feb 2008 15:43

Re: Timer stoppen
 
@SirThornberry:

Ja stimmt, genau das könnte der Fall sein...
aber bei deinem Quelltext, könnte es doch jetzt passieren, dass ich den Timer disable, und er noch die Prozedur abarbeitet, und dann sich selbst wieder aktiviert, oder?!

Zitat:

Daher lieber so:
Zitat:

Delphi-Quellcode:
 procedure TMainGUI.tmrAblaufTimer(Sender: TObject);
begin
  TTimer(Sender).Enabled = False;
  MeinGeraet.HoleDies;
  Application.ProcessMessages; // angenommen mein Obj ist schon freigegeben (dann knallts)
  MeinGeraet.HoleJenes;
  Application.ProcessMessages;
  MeinGeraet.HoleDas;
  TTimer(Sender).Enabled = True;
end;


SirThornberry 22. Feb 2008 15:45

Re: Timer stoppen
 
Das ist richtig. Du kannst ja am Ende das Enabled von einer Bedingung abhängig machen
Delphi-Quellcode:
TTimer(Sender).Enabled = Timer_still_needed;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:53 Uhr.
Seite 1 von 5  1 23     Letzte »    

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