Delphi-PRAXiS
Seite 5 von 5   « Erste     345

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Nach Timer.Enable killt sich das Programm (https://www.delphipraxis.net/208680-nach-timer-enable-killt-sich-das-programm.html)

Rupert 9. Okt 2021 08:48

AW: Nach Timer.Enable killt sich das Programm
 
Liste der Anhänge anzeigen (Anzahl: 2)
Mit dem Debugger kann ich den Punkt auffinden, es ist nach wie vor Timer.enabled...
https://www.delphipraxis.net/attachm...1&d=1633765765
https://www.delphipraxis.net/attachm...1&d=1633766035

Uwe Raabe 9. Okt 2021 09:36

AW: Nach Timer.Enable killt sich das Programm
 
Sag mal, ist das eventuell kein Standard-Timer? Ich lese da TLMDTimeInterval...

venice2 9. Okt 2021 09:48

AW: Nach Timer.Enable killt sich das Programm
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1495864)
Sag mal, ist das eventuell kein Standard-Timer? Ich lese da TLMDTimeInterval...

Ich hatte ihn schon auf normale Timer verwiesen er scheint es aber zu ignorieren.
Der Thread hier ist eine reines Ratespiel.

Rupert 9. Okt 2021 10:23

AW: Nach Timer.Enable killt sich das Programm
 
Zitat:

Zitat von venice2 (Beitrag 1495866)
Zitat:

Zitat von Uwe Raabe (Beitrag 1495864)
Sag mal, ist das eventuell kein Standard-Timer? Ich lese da TLMDTimeInterval...

Ich hatte ihn schon auf normale Timer verwiesen er scheint es aber zu ignorieren.
Der Thread hier ist eine reines Ratespiel.

Natürlich habe ich das nicht ignoriert das Programm modifiziert und den System-Timer probiert. Auch mit einem anderen externen Timer (Sulako) hatte ich auch schon experimentiert.
Stets das selbe, bei Timer.enable kracht es.

Aber dank der vielen Inputs bin ich dem Problem schon sehr nahe gekommen und glaube die Ursache bis kommende Woche gefunden zu haben, denn erstmals konnte ich eine Exception auslösen und die Position auffinden.
Danke jedenfalls für die Tipps!

Rupert 11. Okt 2021 17:16

AW: Nach Timer.Enable killt sich das Programm
 
Ursache gefunden - Problem gelöst.

Das Programm hat nicht nur den Timer, der die Hauptschleife triggert, sondern es gibt noch zwei weitere.
Ein Timer (Timer-A) dient dazu, dass der Heizkessel seinen Impuls bekommt, sich einzuschalten und der andere Timer (Timer-B) erfüllt den Zweck, dass ein oder mehrere Räume schnell aufgeheizt werden (Ferienwohnung wurde kurzfristig gebucht und muss auf Normaltemperatur gebracht werden).

Timer-A läuft 25 min (Kessel)
Timer-B läuft 4 Stunden (Raumheizung)

Timer-B wird durch den Button extra heizen ausgelöst oder auch gestoppt:
Delphi-Quellcode:
  if extraheizenchecked then begin
    if Timer_Extra_heizen.Enabled then begin
      Timer_Extra_heizen.visible:=true;
      Timer_Extra_heizen.StartCountdown;
    end;
  end else
    Timer_Extra_heizen.EndCountdown;
Ereignis OnCountdownEnd sieht so aus:
Delphi-Quellcode:
procedure THauptformular.Timer_Extra_heizenCountdownEnd(Sender: TObject);

var i:SmallInt;

begin
    extraheizenchecked:=false;

    for i:=1 to 23 do // alle Räume
      if Extra_heizen[i] then begin
        Extra_heizen[i]:=false; // Status löschen
        Heizstatus[i]:= normal_erreicht; //egal bei welcher tats. Temperatur
    end;
    Timer_Extra_heizen.Enabled:=false;
    Timer_Extra_heizen.visible:=false;
end;
Dieser Timer verursachte das Problem nicht. Aber Timer-A, der so ähnlich aussieht.

Timer-A:
Der Pellets Heizkessel muss mindestens 25 min laufen, damit der Kamin nicht versottet.

Ereignis OnCountdownEnd sah so aus:

Delphi-Quellcode:
procedure THauptformular.Kessel_Ende_Countdown(Owner:TObject);

Begin
  Kessel_manuell_ein:=false;
  Kesseluhr.Endcountdown();
  Kesseluhr.Visible:=false;
  // kessel wird erst abgeschaltet, wenn die Vorlauf-Temperaturbedingungen erfüllt sind
  Abfrage_Kessel_Ausschalten(nil);
end;
Jeder Timer bedient sich des Windows API Timers und deshalb sah es so aus, als würde der Hauptschleifentimer den Crash verursachen. Tatsächlich verursachte jedoch Timer-A den Stack-Overflow. Nachdem ich mich nicht auf diesen Timer konzentriert habe, fand ic auch die Ursache für den Stack-Overlow nicht sofort.
Erst, als ich einen Demomode eingebaut hatte, um das Programm außerhalb des Heizcomputers zu betreiben erhielt ich die Position, wo sich das Programm gekillt hat - bei der Procedure Kessel_Ende_Countdown
Delphi-Quellcode:
Begin
  Kessel_manuell_ein:=false;
  Kesseluhr.Endcountdown(); // hier wurde Kessel_Ende_Countdown rekursiv aufgerufen
  Kesseluhr.Visible:=false;
  // kessel wird erst abgeschaltet, wenn die Vorlauf-Temperaturbedingungen erfüllt sind
  Abfrage_Kessel_Ausschalten(nil);
end;
Warum der Stack-Overflow nicht bei jedem Kessel_Ende_Countdown ausgelöst wurde weiß ich nicht, ist mir aber nun egal. Die Zeile muss irgendwann versehentlich durch copy/paste hineingerutscht sein, da ich in der Doku keinen Hinweis auf Änderung der Procedure fand.

Vielen, vielen Dank an euch alle.:cheers:
Ihr habt mich großartig unterstützt, denn durch eure Hinweise kam ich dem Verursacher immer näher und fand schließlich die kurze, aber todbringende Zeile, was bei 8032 Programmzeilen gar nicht mehr so einfach ist!


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 Uhr.
Seite 5 von 5   « Erste     345

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