AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Timer stoppen

Ein Thema von DelphiManiac · begonnen am 22. Feb 2008 · letzter Beitrag vom 29. Feb 2008
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#1

Timer stoppen

  Alt 22. Feb 2008, 16:09
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:

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

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;
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Timer stoppen

  Alt 22. Feb 2008, 16:16
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;
  Mit Zitat antworten Zitat
chest3rs

Registriert seit: 15. Okt 2006
Ort: Berlin
84 Beiträge
 
Delphi 7 Personal
 
#3

Re: Timer stoppen

  Alt 22. Feb 2008, 16:21
Du kannst aber eine global Variable, z.B.

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.
  Mit Zitat antworten Zitat
bluesbear

Registriert seit: 14. Dez 2005
Ort: Hahnstätten
355 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Timer stoppen

  Alt 22. Feb 2008, 16:24
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: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;
Klaus M. Hoffmann
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#5

Re: Timer stoppen

  Alt 22. Feb 2008, 16:25
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?
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#6

Re: Timer stoppen

  Alt 22. Feb 2008, 16:27
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Timer stoppen

  Alt 22. Feb 2008, 16:31
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
bluesbear

Registriert seit: 14. Dez 2005
Ort: Hahnstätten
355 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Timer stoppen

  Alt 22. Feb 2008, 16:41
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. Vielleicht ist das ja gut genug.
EDIT: In Kombination mit SirThornberrys Vorschlag. (Das geht mir echt zu schnell hier - ich werde alt )
Klaus M. Hoffmann
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#9

Re: Timer stoppen

  Alt 22. Feb 2008, 16:43
@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;
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Timer stoppen

  Alt 22. Feb 2008, 16:45
Das ist richtig. Du kannst ja am Ende das Enabled von einer Bedingung abhängig machen
TTimer(Sender).Enabled = Timer_still_needed;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 5  1 23     Letzte »    


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 07:06 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