Delphi-PRAXiS
Seite 1 von 2  1 2      

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;

bluesbear 22. Feb 2008 15:52

Re: Timer stoppen
 
Zitat:

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

Na, wenn man schon einen Timer nimmt, dann sollte man ganz ohne Application.ProcessMessages auskommen. Sonst könnte er ja gleich eine while-Schleife nehmen. Siehe meine (viel zu langsam editierten) Posts weiter oben.

SirThornberry 22. Feb 2008 15:55

Re: Timer stoppen
 
genau, das Application ProcessMessages sorgt dort drin nur dafür das es möglich ist in einer anderen procedure das Object weg zu ziehen.
Daher am besten mit einem switch arbeiten und zusätzlich natürlich den Timer im Timer-Event abschalten falls eine Aktion mal etwas längert dauert damit sich die Timer-Events dann nicht aufstauen.

bluesbear 22. Feb 2008 16:03

Re: Timer stoppen
 
Zitat:

Zitat von SirThornberry
genau, das Application ProcessMessages sorgt dort drin nur dafür das es möglich ist in einer anderen procedure das Object weg zu ziehen.
Daher am besten mit einem switch arbeiten und zusätzlich natürlich den Timer im Timer-Event abschalten falls eine Aktion mal etwas längert dauert damit sich die Timer-Events dann nicht aufstauen.

Eine Variante ohne das hatte ich oben ja schon vorgeschlagen. Worüber ich gerade grüble: Können sich Timer-Events überhaupt aufstauen? Wenn ja, wo? Im Windows Message Queue? Oder werden die einfach unterschlagen? Ich dachte bis jetzt letzteres. :gruebel:

DeddyH 22. Feb 2008 16:55

Re: Timer stoppen
 
Eher ersteres, Timer können sich "selbst überholen", wenn das Intervall im falschen Verhältnis zur benötigten Abarbeitungszeit steht.

SirThornberry 22. Feb 2008 17:02

Re: Timer stoppen
 
genau, sie stauhen sich in der Messagequeue. Das merkt man besonders gut wenn man mal einen Breakpoint setzt schritt für Schritt durchgeht und plötzlich wieder am Anfang der Funktion ist weil der nächste Aufruf durch Application.ProcessMessages kam.

bluesbear 22. Feb 2008 17:06

Re: Timer stoppen
 
Zitat:

Zitat von DeddyH
Eher ersteres, Timer können sich "selbst überholen", wenn das Intervall im falschen Verhältnis zur benötigten Abarbeitungszeit steht.

Aber dann müsste er doch 'nachlaufen', wenn man ihn Enabled := False setzt. Das tun die Dinger nicht.
Ich glaube mich wieder erinnert zu haben: Wenn ein Timer sich "überholt" wird genau ein Event erzeugt, auch bei mehrfacher Überholung. Und das dann sofort ausgeführt, wenn der OnTimer abgearbeitet ist.
Von daher ist SirThornberry's (Apostroph weil englisch) Idee gut, denn dann wird am Ende von OnTimer der Timer neu gestartet, und es vergeht ein Timerintervall bis zum nächsten Event.

DeddyH 22. Feb 2008 17:13

Re: Timer stoppen
 
Ich habe doch gar nichts Gegenteiliges behauptet. Wenn ich weiß, dass mein Timer evtl. länger als Intervall brauchen könnte, setze ich ihn auch immer auf false, lasse ihn abarbeiten und aktiviere ihn dann wieder.

bluesbear 22. Feb 2008 17:18

Re: Timer stoppen
 
Zitat:

Zitat von SirThornberry
genau, sie stauhen sich in der Messagequeue. Das merkt man besonders gut wenn man mal einen Breakpoint setzt schritt für Schritt durchgeht und plötzlich wieder am Anfang der Funktion ist weil der nächste Aufruf durch Application.ProcessMessages kam.

Ich bin schon wieder zu langsam :wink: - jetzt, wo Du es sagst: Das Application.ProcessMessages im OnTimer kann sich in der Tat böse auswirken bei Überholvorgängen, bis zum stack overflow :gruebel:
Das war mir noch gar nicht aufgefallen. Sollte man also besser nicht machen.

bluesbear 22. Feb 2008 17:23

Re: Timer stoppen
 
Zitat:

Zitat von DeddyH
Ich habe doch gar nichts Gegenteiliges behauptet.

Ich bin ein bißchen durcheinander gekommen mit der Message-Reihenfolge hier im Thread. Ich fühle mich wie ein OnTimer Event mit einem Application.ProcessMessages drin, bei den kurzen Antwort-Intervall hier :roteyes:

DeddyH 22. Feb 2008 17:23

Re: Timer stoppen
 
Ja, ab 40 lässt die Reaktion rapide nach, ich kenne das :zwinker:

[edit] Rechtschreibung :oops: [/edit]

bluesbear 22. Feb 2008 17:58

Re: Timer stoppen
 
Zitat:

Zitat von DeddyH
Ja, ab 40 lässt die Reaktion rapide nach, ich kenne das :zwinker:

[OT]Das zu sagen, und in der selben Minute noch zu antworten ist ein wenig zynisch :zwinker: [/OT]

DeddyH 22. Feb 2008 18:05

Re: Timer stoppen
 
[OT] Oh shit, ich bin als Zyniker entlarvt :mrgreen: [/OT]

bluesbear 22. Feb 2008 18:17

Re: Timer stoppen
 
Zitat:

Zitat von DeddyH
[OT] Oh shit, ich bin als Zyniker entlarvt :mrgreen: [/OT]

[OT]Ich war mir da bis jetzt nicht so sicher. Hey komm, ich bin relativ neu hier! :mrgreen:
Löschen die Moderatoren den Unfug hier eigentlich wieder? Besser fänd ich das schon. Das is nix fürs Archiv :gruebel: [/OT]

SirThornberry 22. Feb 2008 18:42

Re: Timer stoppen
 
gelöscht wirds nicht (auch sowas muss ab und zu sein sonst fehlt das persönliche und wir können uns gleich ein trockenes Lehrbuch nehmen) aber jetzt kommt ein dezenter Hinweis:
Lasst uns zum Thema zurück kommen :wink:

DelphiManiac 27. Feb 2008 16:24

Re: Timer stoppen
 
Hi,

ja stimmt, der Timer (so einfach er eigentlich ist) kann einem mit Application.ProcessMessages schlimme Probleme
bereiten.

Ich habe es jetzt so gelöst, dass er sich nicht selbst überholen kann:
Delphi-Quellcode:
TTimer(Sender).Enabled:=false;
..
..
..
..
..
TTimer(Sender).Enabled:=TimerSollLaufen;

Wenn ich jetzt extern das Flag TimerSollLaufen auf False setze, dann wird der Timer nach Ablauf der OnTimer Prozedur
beendet.

Meine Frage ist nun, wie kann ich mir sicher sein, dass er wirklich beendet ist?! Ich habe den Timer.Tag dazu genutzt,
mir anzuzeigen, ob er noch aktiv ist (1) oder beendet ist (0),
doch wenn ich auf dieses Flag polle, dann bleibt der Timer einfach stehen!
Gibt es dafür eine Erkärung?!

Delphi-Quellcode:
    while tmrAblauf.Tag >0 do
    begin
      Application.ProcessMessages;
    end;
    // Hier kommt er dann nie hin

DelphiManiac 29. Feb 2008 11:53

Re: Timer stoppen
 
*push* :roll:

bluesbear 29. Feb 2008 12:58

Re: Timer stoppen
 
Wo setzt Du das Tag? Was machst Du sonst noch im Timer-Event? Wo steht die while-Schleife? Ohne den Kontext, in dem die Codeschnipsel stehen, kann ich mir keinen Kopp um Dein Problem machen. Mehr Code! Ich brauch mehr Code! :zwinker:

sirius 29. Feb 2008 13:14

Re: Timer stoppen
 
Die vielen Application.ProcessMessages bringen den ganzen Message-Ablauf total durcheinander. In der selben Zeit, in der du versucht hast, dieses Problem zu richten, hättest du schon einen ganzen Thread samt Synchronisation schreiben können.

Zitat:

Zitat von bluesbear
Mehr Code! Ich brauch mehr Code! :zwinker:

*sing* "Gimme Code Johanna, Code Johanna! Gimme Code Johanne! Before the morning comes."

DelphiManiac 29. Feb 2008 14:08

Re: Timer stoppen
 
Ok du willst Code du kriegst Code :-D

Delphi-Quellcode:
procedure TMainGUI.tmrAblaufTimer(Sender: TObject);
var
  active:Boolean;
  time1,time2:Cardinal;
  Failure:Boolean;
begin
  TTimer(Sender).Enabled:=false;
  active:=False;
  if TimerIsActive then exit;
try
  if not Assigned(aCS200) then Exit;
  TimerIsActive:=True;
  if TimeOut then exit;
  time1:=GetTickCount;
  tmrAblauf.Tag:= tmrAblauf.Tag+1;
  lblRequestVal.Caption:=IntToStr(tmrAblauf.Tag);
  Failure:=False;
  case tmrAblauf.Tag of
    1 : begin
          if (aCS200.Get_TempIntern(TempIntern))=0 then
          begin
            pbFortschritt.Position:=7;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    2 : begin
         if (aCS200.Get_TempExtern(TempExtern))=0 then
         begin
           pbFortschritt.Position:=14;
         end
         else
         begin
           Failure:=True;
         end;
        end;
    3 : begin
          if (aCS200.Get_StoerungsFlags(stoerungsflags))=0 then
          begin
            pbFortschritt.Position:=21;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    4 : begin
          if (aCS200.Get_SollWertFanIntern(SollWertFanIntern))=0 then
          begin
            pbFortschritt.Position:=28;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    5 : begin
          if (aCS200.Get_FanInternSpeed_1(fan1InternSpeed))=0 then
          begin
            pbFortschritt.Position:=35;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    6 : begin
          if (aCS200.Get_Fan1InternPuls(fan1InternPuls))=0 then
          begin
            pbFortschritt.Position:=42;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    7 : begin
          if (aCS200.Get_FanInternSpeed_2(fan2InternSpeed))=0 then
          begin
            pbFortschritt.Position:=49;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    8 : begin
          if (aCS200.Get_Fan2InternPuls(fan2InternPuls))=0 then
          begin
            pbFortschritt.Position:=56;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    9 : begin
          if (aCS200.Get_SollWertFanExtern(SollWertFanExtern))=0 then
          begin
            pbFortschritt.Position:=63;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    10: begin
          if (aCS200.Get_FanExternSpeed_1(fan1ExternSpeed))=0 then
          begin
            pbFortschritt.Position:=70;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    11: begin
          if (aCS200.Get_FanExternSpeed_2(fan2ExternSpeed))=0 then
          begin
            pbFortschritt.Position:=77;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    12: begin
          if (aCS200.Get_Fan1ExternPuls(fan1ExternPuls))=0 then
          begin
            pbFortschritt.Position:=84;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    13: begin
          if (aCS200.Get_Fan2ExternPuls(fan2ExternPuls))=0 then
          begin
            pbFortschritt.Position:=91;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    14: begin
          if (aCS200.Get_StoerungsFlags(stoerungsflags))=0 then
          begin
          pbFortschritt.Position:=95;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    15: begin
          if (aCS200.Get_IOFlags(IOflags))=0 then
          begin
            pbFortschritt.Position:=98;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    16: begin
          if (aCS200.Get_StatusFlags(Statusflags))=0 then
          begin
            pbFortschritt.Position:=100;
          end
          else
          begin
            Failure:=True;
          end;
        end;
    100 +1:
        begin
          WriteDataToDevice(Self);

        end;
    200 +1:
        begin
          ReadDataFromDevice(Self);

        end
    else
    begin
     tmrAblauf.Tag := 0;
     pbFortschritt.Position:=0;
    end;
  end;
  if Failure then
  begin
    MessageDlg('Fehler beim Lesen der Daten aus dem Wärmetauscher',mtError,[mbOK],0);
    exit;
  end;

  if TimeOut then
  begin
    exit;
  end;
  if Assigned(aCS200) then
  begin
    if aCS200.FSCI.isConnected then
    begin
      if not( (Assigned( aCS200 ))) then Exit;
      lnAkuelleInnenTemp.Clear;
      lnAktuelleAussenTemp.Clear;
      if not(stoerungsflags[8]) then
      begin
        // zeichne Aktuelle Innentemp auf Graph "Innenkreis"
        lnAkuelleInnenTemp.AddXY(TempIntern,-20,'',clBlack);
        lnAkuelleInnenTemp.AddXY(TempIntern+0.1,120,'',clBlack);

        // zeichne Aktuelle Innentemp auf Graph "Aussenkreis"
        lnAktuelleAussenTemp.AddXY(TempIntern,-20,'',clBlack);
        lnAktuelleAussenTemp.AddXY(TempIntern+0.1,120,'',clBlack);
      end
      else
      begin
        TempIntern:=-40;
      end;
      lblTempInternVal.Caption:=IntToStr(TempIntern) + ' [°C]';
      if (Statusflags[7]) then
      begin
        // TempFühler Aussen ist wirklich vorhanden
        lblTempExternVal.Caption:=IntToStr(TempExtern) + ' [°C]';
      end
      else
      begin
        lblTempExternVal.Caption:=' --' + ' [°C]';
      end;
      lblSollWertFanInternVal.Caption:=IntToStr(SollWertFanIntern) + ' [%] ';
      lblFanSpeed1InternVal.Caption:=IntToStr(fan1InternSpeed)+ ' [rpm] ' +
      ' bei '+IntToStr(fan1InternPuls)+ ' [P/s]';
      lblFanSpeed2InternVal.Caption:=IntToStr(fan2InternSpeed)+ ' [rpm]'+
      ' bei '+IntToStr(fan2InternPuls)+ ' [P/s]';


      lblSollWertFanExternVal.Caption:=IntToStr(SollWertFanExtern) + ' [%] ';
      lblFanSpeed1ExternVal.Caption:=IntToStr(fan1ExternSpeed)+ ' [rpm] ' +
      ' bei '+IntToStr(fan1ExternPuls)+ ' [P/s]';
      lblFanSpeed2ExternVal.Caption:=IntToStr(fan2ExternSpeed)+ ' [rpm]'+
      ' bei '+IntToStr(fan2ExternPuls)+ ' [P/s]';
      if IOflags[6] then begin
        ledTuerkontakt.ColorOn:=clLime;
      end else
      begin
        ledTuerkontakt.ColorOn:=clGray;
      end;
      if IOflags[5] then begin
        ledEndSchalter1.ColorOn:=clLime;
      end else
      begin
        ledEndSchalter1.ColorOn:=clGray;
      end;
      if IOflags[4] then begin
        ledEndSchalter2.ColorOn:=clLime;
      end else
      begin
        ledEndSchalter2.ColorOn:=clGray;
      end;
      if IOflags[3] then begin
        ledInAlarm1.ColorOn:=clLime;
      end else
      begin
        ledInAlarm1.ColorOn:=clGray;
      end;
      if IOflags[2] then begin
        ledInAlarm2.ColorOn:=clLime;
      end else
      begin
        ledInAlarm2.ColorOn:=clGray;
      end;
      if IOflags[8] then begin
        ledAlarm1.ColorOn:=clRed;
      end else
      begin
        ledAlarm1.ColorOn:=clGray;
      end;
      if IOflags[9] then begin
        ledAlarm2.ColorOn:=clRed;
      end else
      begin
        ledAlarm2.ColorOn:=clGray;
      end;
      if IOflags[10] then begin
        ledAlarm3.ColorOn:=clRed;
      end else
      begin
        ledAlarm3.ColorOn:=clGray;
      end;
      if IOflags[11] then begin
        ledHeizung.ColorOn:=clLime;
      end else
      begin
        ledHeizung.ColorOn:=clGray;
      end;
      if IOflags[12] then begin
        ledSammelstoerung.ColorOn:=clLime;
      end else
      begin
        ledSammelstoerung.ColorOn:=clGray;
      end;
      if IOflags[13] then begin
        ledExtern.ColorOn:=clLime;
      end else
      begin
        ledExtern.ColorOn:=clGray;
      end;
      if IOflags[14] then begin
        ledIntern.ColorOn:=clLime;
      end else
      begin
        ledIntern.ColorOn:=clGray;
      end;

      // Stoerungsflags
      lstStoerung.Clear;
      if stoerungsflags[8] then
      begin
        lstStoerung.AddItem('Temp-Sensor (intern) def.',nil);
        lblTempInternVal.Caption:='-- ' + ' [°C]';
        TempIntern:=-40;

      end;
      if stoerungsflags[7] then
      begin
        lstStoerung.AddItem('Temp-Sensor (extern) def.',nil);
        lblTempExternVal.Caption:='-- ' + ' [°C]';
      end;
      if stoerungsflags[6] then
      begin
        lstStoerung.AddItem('Feuchte-Sensor def.',nil);
      end;
      if stoerungsflags[1] then
      begin
        lstStoerung.AddItem('Fan-2 (extern) def.',nil);
      end;
      if stoerungsflags[2] then
      begin
        lstStoerung.AddItem('Fan-1 (extern) def.',nil);
      end;
      if stoerungsflags[3] then
      begin
        lstStoerung.AddItem('Fan-2 (intern) def.',nil);
      end;
      if stoerungsflags[4] then
      begin
        lstStoerung.AddItem('Fan-1 (intern) def.',nil);
      end;
      if stoerungsflags[5] then
      begin
        lstStoerung.AddItem('Heizung def.',nil);
      end;
      active:=True;
    end
    else
    begin
      InitGUI;
      exit;
    end;
  end;
  time2:=GetTickCount -time1;
finally
//    windows.Beep(1500,200);
  TTimer(Sender).Enabled:=TimerSollLaufen;
  if not(TimerSollLaufen) then InitGUI;
  TimerIsActive:=false;
  if active then
  begin
    ledVerbunden.ColorOn:=clLime;;
  end
  else
  begin
    ledVerbunden.ColorOn:=clGray;
  end;
end;
end;

bluesbear 29. Feb 2008 14:24

Re: Timer stoppen
 
Nach dem ersten Timer-Event ist tmrAblauf.Tag immer größer Null, richtig?
Und mit den Exit springst du am finally Block vorbei raus. Ist das Absicht?

sirius 29. Feb 2008 14:30

Re: Timer stoppen
 
Zitat:

Zitat von bluesbear
Und mit den Exit springst du am finally Block vorbei raus. Ist das Absicht?

Nöö, seit wann denn das?

DelphiManiac 29. Feb 2008 14:56

Re: Timer stoppen
 
Ja ist schon richtig, und so gewollt.

Deswegen stehts ja nicht im try Block.

bluesbear 29. Feb 2008 15:18

Re: Timer stoppen
 
Zitat:

Zitat von sirius
Zitat:

Zitat von bluesbear
Und mit den Exit springst du am finally Block vorbei raus. Ist das Absicht?

Nöö, seit wann denn das?

Tatsächlich! ein Exit springt in den finally-Block. Wer hätte das gedacht. Peinlich, peinlich :oops: errare ursum est.

bluesbear 29. Feb 2008 16:40

Re: Timer stoppen
 
Eine Frage, etwas OT, habe ich zur Codeformatierung:
Delphi-Quellcode:
if (aCS200.Get_TempIntern(TempIntern))=0 then
begin
  pbFortschritt.Position:=7;
end
else
begin
  Failure:=True;
end;

// so würde ich das schreiben:

if (aCS200.Get_TempIntern(TempIntern)) = 0 then pbFortschritt.Position := 7
                                           else Failure := True;
Gilt das heutzutage als schlechter Stil, und ich werde gesteinigt, weil ich "Jehova" gesagt habe? Ich finde das wesentlich übersichtlicher, weil man weniger scrollen muss.

Neumann 29. Feb 2008 17:51

Re: Timer stoppen
 
Die Lösung war doch schon fast gefunden, ich mache es mit den Timern immer so:

procedure Tmainform.Timer1Timer(Sender: TObject);
Delphi-Quellcode:
begin
  try
    if timer1.Tag>0 then exit;
    timer1.Tag:=1;
    Tu Was ....
  finally
    timer1.Tag:=0;
end;
Damit kann man Mehtfachaufruf sicher verhindern.

Gruß

DelphiManiac 29. Feb 2008 19:46

Re: Timer stoppen
 
Meine ursprüngliche Frage war eigentlich,

wie ich feststelle, dass die Timerprozedur fertig abgearbeitet ist,

angenommen ich nutzt dort ein Objekt, das ich woanders freigeben will,
dann muss ich dort warten bis die Prozedur beendet ist.

bluesbear 29. Feb 2008 19:57

Re: Timer stoppen
 
Zitat:

Zitat von DelphiManiac
Meine ursprüngliche Frage war eigentlich,wie ich feststelle, dass die Timerprozedur fertig abgearbeitet ist (...)

Nu jetzt kapiere ich gar nix mehr. Willst Du mich veräppeln? Entweder Du fügst am Ende der Timerprozedur den entsprechenden Code ein, oder Du machst da ein PostMessage, setzt ein Flag oder tust sonstwas. Langsam werde ich hier paranoid. :snowball:

DelphiManiac 29. Feb 2008 20:05

Re: Timer stoppen
 
Hi,

nee veräppeln will ich hier niemanden, aber vielleicht steh ich ja auch gerade aufm Schlauch :?

Ich habe ja 1 Flag

-TimerIsActive

Das setze ich beim Entritt und lösche es beim Austritt der Prozedur.

Wenn ich jetzt auf dieses Flag polle bis es False ist dann habe ich einen Deadlock...

bluesbear 29. Feb 2008 20:29

Re: Timer stoppen
 
Zitat:

Zitat von DelphiManiac
Ich habe ja 1 Flag -TimerIsActive

HmmHmmm <imbartkratz>. Ok, sorry für meine paranoide Reaktion.
Das ist in der Tat seltsam. Ich würde herumexperimentieren, um diesem Problem auf die Schliche zu kommen. Wenn Du den Timer sehr langsam einstellst (sagen wir mal so 3s, pi mal daumen) - taucht dann das Phänomen noch auf?

DelphiManiac 29. Feb 2008 20:59

Re: Timer stoppen
 
Hi bluesbear,

das werde ich mal probieren, versuche das mal über extreme Debugging :lol:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:13 Uhr.
Seite 1 von 2  1 2      

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