![]() |
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:
Z.b.: wenn ich die Verbindung zur Schnittstelle beende.
meinTimer.enabled:=false;
Dann will ich auch mein Objekt freigeben:
Delphi-Quellcode:
MeinGeraet.Free;
Timerprozedur:
Delphi-Quellcode:
In meinem Disconnect Button mach ich folgendes:
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;
Delphi-Quellcode:
Ich brauch hier eine Synchronisationsmethode, um auf das Ende vom der Timerprozedur zu warten, wie kann ich das machen???
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; Danke euch! end; |
Re: Timer stoppen
Vielleicht so?
Timerprozedur:
Delphi-Quellcode:
Timer soll beendet werden:
procedure TMainGUI.tmrAblaufTimer(Sender: TObject);
begin if MeinGereat <> nil then begin MeinGeraet.HoleDies; Application.ProcessMessages; MeinGeraet.HoleJenes; Application.ProcessMessages; MeinGeraet.HoleDas; end end;
Delphi-Quellcode:
begin
meinTimer.enabled:=false; // MeinGeraet.Free; FreeAndNil (MeinGeraet); end; |
Re: Timer stoppen
Du kannst aber eine global Variable, z.B.
Delphi-Quellcode:
und dann im Timer den an der Stelle den Status checken.
Enabled : Boolean
Oder ob der Timer.Enabled = True ist. Jedenfalls würde ich noch Bedingungen mit einbringen. |
Re: Timer stoppen
Zitat:
Alternativ eine Version ohne Application.ProcessMessages: Im Form deklarieren:
Delphi-Quellcode:
und dann
FtCount : Integer;
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; |
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? |
Re: Timer stoppen
Zitat:
hier ist ein Warten auf eine Antwort drin, das verögert meine GUI-Ausführung |
Re: Timer stoppen
was mir bei dem Quelltext auffällt:
Delphi-Quellcode:
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.
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; 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; |
Re: Timer stoppen
Zitat:
EDIT: In Kombination mit SirThornberrys Vorschlag. (Das geht mir echt zu schnell hier - ich werde alt :| ) |
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:
Zitat:
|
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 04:25 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