Programm beendet sich nicht

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
cgaertner
Beiträge: 27
Registriert: Sa 10. Okt 2020, 21:54

Programm beendet sich nicht

Beitrag von cgaertner »

Liebe Profis hier,

meine Frage dreht sich um die Tatsache, daß sich mein Programm nicht vollständig beendet. Damit meine ich, trotz dem obligaten "Application.Terminate;" im FormClose-Event (ebenfalls getestet: "CloseAction := caFree;" und "Halt;") läuft mein Programm im Hintergrund weiter. Das Hauptfenster wird zwar geschlossen, aber im Debugger ist der "Stop"-Button noch aktiv und außerhalb der IDE verschwindet der Task nicht aus dem Windows Task-Manager. Mit dem Debugger habe ich getestet, die FormClose-Routine wird wirklich durchlaufen.

Das Problem tritt nur auf, wenn eine bestimmte externe dll im Spiel ist, die ich mit "LoadLibrary" dynamisch lade, aber natürlich auch mit "FreeLibrary" bzw. "UnloadLibrary" beim Programmende wieder entlade (ich bekomme hier true zurück, also wurde sie erfolgreich entladen). Bei einer anderen dll vom selben Hersteller, die ich auf dieselbe Art lade und entlade, habe ich das Problem nicht. Ich habe mir daher ein kurzes Testprogramm geschrieben, das nur die betreffende dll lädt, kurz verwendet und wieder entlädt ... da funktoniert es. Es liegt also offenbar nicht an der dll. Ich habe auch schon probiert, mit <form>.Close alle Formulare zu schließen, falls noch irgendeines offen sein sollte. Das kann zwar eigentlich nicht sein, da alle Fenster modal sind, aber man weiß ja nie. Das hat aber auch nichts geändert.

Nach der Vorgeschichte nun meine Frage:
Wie kann ich in der IDE (oder sonstwie) feststellen, weshalb sich das Programm nicht beendet? Also z.B. welche Ressource noch geblockt ist, ob noch irgendeine Form offen ist oder was auch immer?

Ah ja, die technischen Daten: Windows 7 64bit, das neueste Lazarus (2.0.10 mit fpc-3.2.0), allerdings erstelle ich eine 32bit exe, weil die betreffenden dlls 32bit sind.

Danke und viele Grüße,
Christian

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

Re: Programm beendet sich nicht

Beitrag von wp_xyz »

Keine Ahnung, ob das etwas mit dem Problem zu tun hat. Aber warum beendest du ein Programm mit Terminate im OnClose-Event? Es reicht aus, einfach die Methode Close des Haupt-Formulars aufzurufen.

Benutzeravatar
Aidex
Beiträge: 60
Registriert: Do 24. Sep 2020, 07:02
OS, Lazarus, FPC: Win10 64bit, Laz v2.0.10
CPU-Target: AMD64

Re: Programm beendet sich nicht

Beitrag von Aidex »

Werden in dem Programm Threads verwendet?
Ich glaube die Programm-Instanz wird erst beendet, wenn alle (Neben)Threads beendet sind.

cgaertner
Beiträge: 27
Registriert: Sa 10. Okt 2020, 21:54

Re: Programm beendet sich nicht

Beitrag von cgaertner »

wp_xyz hat geschrieben:
So 21. Feb 2021, 23:45
Keine Ahnung, ob das etwas mit dem Problem zu tun hat. Aber warum beendest du ein Programm mit Terminate im OnClose-Event? Es reicht aus, einfach die Methode Close des Haupt-Formulars aufzurufen.
Hallo wp_xyz,

es gibt mehrere Methoden, das Programm zu beenden (Datei - Ende, X, ...) und ich muß beim Beenden noch ein paar Dinge erledigen (z.B. dlls entladen) und deshalb rufe ich bei allen Aktionen, die das Programm beenden sollen, Close auf und im OnCLose-Event erledige ich dann die Sachen. Das Terminate habe ich einfach nur der Vollständigkeit halber drinnen; wenn ich es rausnehme, ändert sich das Verhalten des Programmes (und damit mein Problem) nicht.

Liebe Grüße,
Christian

cgaertner
Beiträge: 27
Registriert: Sa 10. Okt 2020, 21:54

Re: Programm beendet sich nicht

Beitrag von cgaertner »

Aidex hat geschrieben:
Mo 22. Feb 2021, 05:46
Werden in dem Programm Threads verwendet?
Ich glaube die Programm-Instanz wird erst beendet, wenn alle (Neben)Threads beendet sind.
Hallo Aidex,

nein, das Programm verwendet keine Threads - zumindest keine von mir bewußt gestarteten.

Liebe Grüße,
Christian

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: Programm beendet sich nicht

Beitrag von af0815 »

Grundlegend würde ich einmal den LazLogger nehmen und in die lpr Datei mir beim Einstieg in die Hauptroutine und am Ende mir mal eine Ausgabe machen lassen. Damit sieht man ob das Hauptformular wirklich geschlossen wird oder nicht. Oder ob ev. auch noch ein anderes Formular da herumhängt.
Weiter, hast du Heaptrace aktiviert, weil das kann, wenn aktiviert, auch das herunterfahren verzögern, wen du Speicherlücken hast.

Code: Alles auswählen

const
  co_heaptrc = 'log.txt';
........ 
begin
// If you want to show heaptrc report dialog only if there were leaks
//   in your application, then put this command somewhere
//   in your main project source file:
{$if declared(UseHeapTrace)}
  GlobalSkipIfNoLeaks := true; // supported as of debugger version 3.1.1
  if FileExists(co_heaptrc) then
      DeleteFile(co_heaptrc);
  SetHeapTraceOutput(co_heaptrc); // supported as of debugger version 3.1.1
  //   HaltOnError := false;             // dont halt a the end of the programm
{$endif}
  DebugLnEnter('****************************************************************');
  DebugLn('Starting...');
  RequireDerivedFormResource:=True;
  Application.Initialize;
  Application.CreateForm(TFormMain, FormMain);
  Application.Run;
  DebugLnExit('...Finishing');
end.
So sieht bei mir eine Typische lpr aus.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten