Delphi-PRAXiS
Seite 3 von 5     123 45      

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)

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:33 Uhr.
Seite 3 von 5     123 45      

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