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
Programm beendet sich nicht
Re: Programm beendet sich nicht
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.
- 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
Werden in dem Programm Threads verwendet?
Ich glaube die Programm-Instanz wird erst beendet, wenn alle (Neben)Threads beendet sind.
Ich glaube die Programm-Instanz wird erst beendet, wenn alle (Neben)Threads beendet sind.
Re: Programm beendet sich nicht
Hallo wp_xyz,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.
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
Re: Programm beendet sich nicht
Hallo Aidex,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.
nein, das Programm verwendet keine Threads - zumindest keine von mir bewußt gestarteten.
Liebe Grüße,
Christian
- af0815
- Lazarusforum e. V.
- Beiträge: 6780
- 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
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.
So sieht bei mir eine Typische lpr aus.
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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).