Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Benutzeravatar
stoffel_hessen
Beiträge: 66
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von stoffel_hessen »

Hallo Gemeinde,

ich habe die ganze Zeit meine Anwendung mit einem "HALT" beendet, vorher wurden die erzeugten "TStringList"en mit "Free" freigegeben.
Nun möchte ich es richtig machen und schließe erst alle erzeugten "TStringList"en und im Anschluss beende ich die Applikation mit

Code: Alles auswählen

procedure MeineAPP.Aufraeumen;
begin
  TextDatei_Vorlage_Core.Free;
  VorlageGrundkonfig.free;
  VorlageService.free;
  VorlageService_CPE2.free;
  KonfigDatei.free;
  Application.MainForm.Close;
end;
Dies führt zu einem Fehler bei "Application.MainForm.Close;"
External STACK OVERFLOW.jpg
External STACK OVERFLOW.jpg (10.04 KiB) 1077 mal betrachtet
Was mache ich falsch, bzw. wie kann ich den Fehler beheben?

Danke für die Unterstützung
Gruß Christopher

Benutzeravatar
stoffel_hessen
Beiträge: 66
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von stoffel_hessen »

Noch ein Hinweis,

in der Meine.lpr stehen die nachfolgen Anweisungen.

Code: Alles auswählen

begin
  Application.Initialize;
  Application.CreateForm(TSDIMeineAPP, SDIMeineAPP);
  Application.CreateForm(TForm_Ausgabe_Fenster, Form_Ausgabe_Fenster);
  Application.CreateForm(TForm_VSI, Form_VSI);
  Application.CreateForm(TF_Tunnel_Daten, F_Tunnel_Daten);
  Application.CreateForm(TSonderkonfig, Sonderkonfig);
  Application.CreateForm(TCPE2_Daten, CPE2_Daten);
  Application.CreateForm(TFormCorePort, FormCorePort);
  Application.Run;
end.
Beim schließen der Anwendung ist nur das Hauptfenster geöffnet
Gruß Christopher

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 167
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von Jorg3000 »

Versuch mal FreeAndNIL() anstelle der .Free in deiner Aufraeumen-Procedure.
Normalerweise würde man zwar keinen Stack Overflow erwarten, falls eine Variable durch Close doch nochmal verwendet würde, aber vielleicht ändert sich dadurch etwas, das dich der Ursache näher bringt.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von af0815 »

Warum schliesst du nicht einfach das Hauptfenster ? Im OnDestroy auräumen und es sollte passen.

Das mit dem Stack Overflow deutet auf eine Rekursion hin. Nicht das dein aufräumen rekursiv aufgerufen wird durch das explizite aufrufen von close.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
stoffel_hessen
Beiträge: 66
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von stoffel_hessen »

af0815 hat geschrieben:
Di 9. Aug 2022, 13:09
Warum schliesst du nicht einfach das Hauptfenster ? Im OnDestroy auräumen und es sollte passen.
Leider befinde ich mich noch im Tal der Ahnungslosen, habe es nun abgeändert, nun kommt es zu keinem Fehler mehr
af0815 hat geschrieben:
Di 9. Aug 2022, 13:09
Das mit dem Stack Overflow deutet auf eine Rekursion hin. Nicht das dein aufräumen rekursiv aufgerufen wird durch das explizite aufrufen von close.
Das war wohl so.

DANKE für die Unterstützung
Gruß Christopher

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von PascalDragon »

stoffel_hessen hat geschrieben:
Di 9. Aug 2022, 12:01
Was mache ich falsch, bzw. wie kann ich den Fehler beheben?
Von wo aus rufst du denn dein Aufraumen auf? Wenn du das in einem OnClose oder so machst, dann beißt sich die Katze selbst in den Schwanz und du hast eine endlose Rekursion (weswegen dir dann auch der Stack ausgeht).
Pack die ganzen Free-Aufrufe in den OnDestroy deines Formulars (oder was ist MeineApp?) und ruf einfach nur Application.MainForm.Close statt Aufraumen auf, wenn du das Formular schließen möchtest (außer im OnClose!).
FPC Compiler Entwickler

Benutzeravatar
stoffel_hessen
Beiträge: 66
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von stoffel_hessen »

Ich habe mich zu früh gefreut.
In meinem Hauptformular werden auch weitere Formulare aufgerufen.
Diese Formulare schließe ich jeweils mit einem Button, dieser ruft dann im Formular "Form_Ausgabe_Fenster"

Code: Alles auswählen

Form_Ausgabe_Fenster.Close;
auf und das Formular schließt sich dann auch ohne Fehler.
Schließe ich nun das Hauptformular, kommt erneut der Stack Overflow.
Wie schieße ich welches Fenster richtig, so das es zu keinem Stack Overflow mehr kommt.
In den Unterformularen habe ich folgenden stehen:

Code: Alles auswählen

procedure TFormCorePort.FormDestroy(Sender: TObject);
begin
  aufraeumen_coreport;
end;
procedure TFormCorePort.aufraeumen_coreport;
begin
  FormCorePort.Close;
end;
procedure TFormCorePort.BT_Core_AbbruchClick(Sender: TObject);
begin
//        close;
  aufraeumen_coreport;
end;
Im Hauptformular habe ich
Hauptformular_01.JPG
Hauptformular_01.JPG (10.54 KiB) 1046 mal betrachtet
Außerdem gibt es die Procedure

Code: Alles auswählen

procedure TMeineAPP.FormDestroy(Sender: TObject);
begin
  Aufraeumen;
end;

procedure TMeineAPP.Aufraeumen;
begin
  TextDatei_Vorlage_Core.Free;
  VorlageGrundkonfig.free;
  VorlageService.free;
  VorlageService_CPE2.free;
  KonfigDatei.free;
  Application.MainForm.Close;  
end;
Und das liegt hinter dem Click auf den Exit-Button

Code: Alles auswählen

procedure TMeineAPP.BTExitClick(Sender: TObject);
begin
  Aufraeumen;
end;

Bin total verwirrt, was muss nun wo hinein und was erzeugt eine Rekursion?
Gruß Christopher

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von Winni »

Hi!

Erstmal einen Schritt zurück.

Warum beendest Du eine Form mit Halt?

Halt ist eine ziemlich brutale Maßnahme und kümmert sich nicht um aufräumen.
Close ist die normale Vorgehensweise.

Wenn Du eine Form schließt, dann wir durch das close das FormDestroy aufgerufen und dort bringt man alles Speicher-Aufräumen unter - nur von Sachen, die man selbst gestartet hat.


Winni

Benutzeravatar
stoffel_hessen
Beiträge: 66
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von stoffel_hessen »

Ich habe nun in allen Formularen auf den Klick auf den Exit-Button ein "Close" hinterlegt.
Das Hauptformular wird über "OnDestroy-> FormDestroy geschlossen

Code: Alles auswählen

procedure MeineAPP.FormDestroy(Sender: TObject);
begin
  TextDatei_Vorlage_Core.Free;
  VorlageGrundkonfig.free;
  VorlageService.free;
  VorlageService_CPE2.free;
  KonfigDatei.free;
  Application.MainForm.Close;
end;
Eine Frage habe ich aber noch in diesem Zusammenhang, wird das "OnDestroy" immer aufgerufen, wenn das Formular geschlossen wird.
Also sowohl über einen Button mit einem "Close" sowie auch wenn das Formular mit dem "X" oben rechts geschlossen wird.
Gruß Christopher

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von wp_xyz »

stoffel_hessen hat geschrieben:
Di 9. Aug 2022, 14:33
Eine Frage habe ich aber noch in diesem Zusammenhang, wird das "OnDestroy" immer aufgerufen, wenn das Formular geschlossen wird.
Also sowohl über einen Button mit einem "Close" sowie auch wenn das Formular mit dem "X" oben rechts geschlossen wird.
Setze einfach einen Breakpoint auf irgendeiner Zeile deines OnDestroy-Handlers und probier's aus. Wenn das Programm dort anhält, wird die OnDestroy-Routine aufgerufen.

Benutzeravatar
stoffel_hessen
Beiträge: 66
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von stoffel_hessen »

wp_xyz hat geschrieben:
Di 9. Aug 2022, 14:49
Setze einfach einen Breakpoint auf irgendeiner Zeile deines OnDestroy-Handlers und probier's aus. Wenn das Programm dort anhält, wird die OnDestroy-Routine aufgerufen.
Danke, darauf hätte ich auch selbst kommen können :oops: .
Und Ja, wird er :D
Gruß Christopher

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von af0815 »

Nur vielleicht so als Info für stabilere Programme.

Bei mir wird NUR EIN Formular automatisch erzeugt, alle anderen Formulare bzw. Datenmodule erst wenn sie benötigt werden von diesen einem Formular. Viele Formulare haben einen ganz kurzen Lebenszyklus, die werden dynamisch erstellt, modal aufgerufen, Frage Daten ab oder zeigen die an und werden anschließend wieder zerstört. Je besser man die ganzen Resourcen im Griff hat umso stabiler wird alles. Auch lassen sich Formulare dann einzeln testen (wenn man entsprechend gekapselt hat) und man hat stabilere Programme, die nicht mehr von Zufällen in der Erstellung abhängen. Vor allen wer könnte vielleicht für das Destroy zuständig sein. Gerne mach ich mal beständige Formulare die mittels Singleton erstellt werden und quasi global bei mir genützt werden. Verhalten sich bei mir wie intelligente Dialoge :-)

Und immer eine Debug und Release Version erstellen, Entwicklung mit allen Debugeinstellungen eingeschaltet ! Und Vermeidung, das im eigenen Code 'Hints' auftauchen. Diese entweder bearbeiten oder gezielt im Quellcode deaktivieren. (NICHT generell unterdrücken ! - Außer den Hints zu Inline :-) )
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von TBug »

Hallo zusammen,

hier passen einige Angaben des TE nicht zusammen.

In der geposteten lpr gibt es keine Form mit dem Namen "MeineAPP" und "TMeineAPP", welche in den darauffolgenden Posts genannt werden und einen FormDestroy-Event besitzen aber eine TSDIMeineAPP.

Sollte es sich bei diesen 3 Fenstern um jeweils das selbe handeln, nur im Laufe des Thread umbenannt, dann ist die erste Ursache im FormDestroy-Event zu suchen. Denn dann würde es sich um das Hauptfenster handeln, welches beim Zerstären selbst nochmals das Close aufruft und wieder und wieder....

Winni hat geschrieben:
Di 9. Aug 2022, 14:22
Wenn Du eine Form schließt, dann wir durch das close das FormDestroy aufgerufen
Naja nicht immer.

FormDestroy wird nur aufgerufen, wenn die CloseAction auf caFree gesetzt ist.
.

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von PascalDragon »

stoffel_hessen hat geschrieben:
Di 9. Aug 2022, 14:01
In den Unterformularen habe ich folgenden stehen:

Code: Alles auswählen

procedure TFormCorePort.FormDestroy(Sender: TObject);
begin
  aufraeumen_coreport;
end;
procedure TFormCorePort.aufraeumen_coreport;
begin
  FormCorePort.Close;
end;
procedure TFormCorePort.BT_Core_AbbruchClick(Sender: TObject);
begin
//        close;
  aufraeumen_coreport;
end;
Da ist auch schon dein Fehler: Wenn der OnDestroy Handler aufgerufen wird, dann ist dein Formular bereits einerseits geschlossen und andererseits dabei abgebaut zu werden. Nun rufst du dort indirekt Close auf (*), was wiederum dazu führen wird, dass der OnDestroy Handler aufgerufen wird und so weiter. Räum in einem OnDestroy Handler einfach nur die Sachen auf, die du im OnCreate oder während der Laufzeit des Formulars angelegt hast (ohne eventuelle dynamische Controls mit einem gültigen Owner) und nichts anderes. Dieser Handler wird wirklich nur ganz zum Schluss zur Lebenszeit des Formulars aufgerufen.

(*) Du solltest innerhalb des Formulars nicht die global Variable des Formulars benutzen, da dies dazu führen würde, wenn du das Formular zweimal gleichzeitig erstellst, dass das falsche Formular geschlossen wird. Mach einfach nur Close.
FPC Compiler Entwickler

Benutzeravatar
stoffel_hessen
Beiträge: 66
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Application.MainForm.Close verursacht einen >>External: STACK OVERFLOW<<

Beitrag von stoffel_hessen »

Vielen Dank für eure Unterstützung und Erklärungen.
Gruß Christopher

Antworten