![]() |
Programmprozess läuft weiter, obwohl "Windows"-Kre
Hallo,
folgendes Problem: Meine Anwendung hat einen programmierten Ende-Button, der auch tadellos funktioniert. Aber wenn man auf das Windows-eigene Beenden klickt (Kreuz rechts oben), dann schließt zwar mein Programm, der Prozess läuft aber weiter. Was deswegen schlecht ist, weil ich einen Mutex eingebaut habe, der einen Doppelstart verhindert. Wenn aber der Prozess noch läuft, lässt sich mein Programm demnach nicht mehr starten, obwohl es ja scheinbar geschlossen ist. Eine Forumssuche hat leider nichts gebracht. Details zum Programm reiche ich gerne nach, falls gebraucht, sie sollten aber - da das doch ein Windows-Prozess ist - nichts damit zu tun haben, oder?? Wer hat eine Idee, woran das liegen könnte? Vielen Dank für die Hilfe schon mal, litotes /edit: Der "vergessene" Prozess im Taskmanager bleibt übrigens nicht immer drin, manchmal beendet er auch sauber... |
Re: Programmprozess läuft weiter, obwohl "Windows"
Hast du evtl. noch einige Funktionen oder Threads laufen so das der Prozess die "Endabarbeitung" nicht durchfühen kann?
Sind irgendwelche Verbindungen (DB/ActiveX/OpenGL/...) aktiv die (in eingebundenen DLL's) u.U. nicht beendet werden können? |
Re: Programmprozess läuft weiter, obwohl "Windows"
Hallo,
eben nicht: keine dlls eingebunden, keine Datenbankverbindung, usw. Es werden zwar Programme gestartet, wie Word, Adobe Reader, IE, usw., aber der Prozess bleibt auch schon nach Klicken des Kreuzes im ersten Schirm hängen, wenn es diese Formulare und Aktionen noch gar nicht gibt, da sie dynamisch während der Laufzeit erzeugt werden... litotes |
Re: Programmprozess läuft weiter, obwohl "Windows"
Verwendest Du irgentwelche Schleifen, die nicht enden _könnten_ und in denen Du ProcessMessages aufrufst?
|
Re: Programmprozess läuft weiter, obwohl "Windows"
Was steht in OnClose, OnCloseQuery, OnDestroy?
|
Re: Programmprozess läuft weiter, obwohl "Windows"
Moin litotes,
und noch eine Möglichkeit: Erzeugst du vielleicht eine grössere Menge von Objekten, so dass das Aufräumen einfach viel Zeit in Anspruch nimmt, bevor sich der Prozess beendet? |
Re: Programmprozess läuft weiter, obwohl "Windows"
Starte doch die App von der IDE mit Debug-DCU's und drück mal nach ein paar Sekunden "unsichtbarkeit" den Pause-Button und schau mal wo du landest.
|
Re: Programmprozess läuft weiter, obwohl "Windows"
Guten Morgen,
erstmal vielen Dank für die vielen Vorschläge. Im Einzelnen: 1. es gibt kein onclose, kein onclosequery, nur ein destroy:
Delphi-Quellcode:
2. Es gibt 2x processMessages, einmal in einer Dateisuche, und dann in einem Test,
If HotKeySet then
UnRegisterHotKey(Self.Handle, HotKeyID); ob ein Programm läuft. Aber auch diese Formulare werden erst zu einem Zeitpunkt erzeugt, an dem das Programm schon längst über das Kreuz beendet ist (eben nach erstem Schirm) 3. Ich erzeuge kaum Objekte (siehe 2), denn jedes Formular bis auf die ersten 3 werden erst zur Laufzeit jeweils erzeugt und dann immer mit
Delphi-Quellcode:
freigegeben.
Screen.ActiveForm.Release;
4. Wenn ich nach ein paar Sekunden der "Unsichtbarkeit" den Pause-Button drücke, dann lande ich tatsächlich in (siehe 3) dem
Delphi-Quellcode:
Das sieht so aus, dass bei jedem Formularwechsel folgendes passiert in onHide:
Screen.ActiveForm.Release;
Delphi-Quellcode:
und in einem Formular sind alle Methoden gesammelt. Dort ist auch speicherfreigeben(); :
speicherfreigeben();
Delphi-Quellcode:
procedure speicherfreigeben();
begin try Screen.ActiveForm.Release; except ShowMessage('Ein schwerwiegender Fehler ist aufgetreten. #13#10Das Programm wird geschlossen. #13#10 Bitte starten Sie es neu.'); Application.Terminate; end; end; Und Formulare werden so gewechselt:
Delphi-Quellcode:
hide;
F_Hier_Starten := TF_Hier_Starten.create(Application); F_Hier_Starten.show; Vielleicht hilft euch das weiter... Vielen Dank, litotes |
Re: Programmprozess läuft weiter, obwohl "Windows"
Hallo,
aha, du versteckst das mainform und erzeugst ein anderes ? Dann klickst du auf das Kreuz des "anderen" und wunderst dich, dass das versteckte mainform immer noch da ist ... Heiko |
Re: Programmprozess läuft weiter, obwohl "Windows"
Hallo Hoika,
bin nicht sicher, ob ich dich verstehe, aber die "Mainform", also die erste die erzeugt wird, wird ja nicht nur versteckt (hide), sondern mit Release zerstört. Ausserdem passiert das ganze ja schon, bevor ich sie verstecke, also so: 1. Programmstart (3 Formulare werden erzeugt) 2. Das erste Formular erscheint. 3. Ich drücke auf das Windows-Kreuz 4. Programm schließt, Prozess ist aber noch im Taskmanager. litotes |
Re: Programmprozess läuft weiter, obwohl "Windows"
Zitat:
|
Re: Programmprozess läuft weiter, obwohl "Windows"
Hi,
der Ende-Button ist ein simples onClick auf einen Button, mit:
Delphi-Quellcode:
So jedenfalls hat meine Forumssuche ergeben, ist der beste Weg, zu beenden.
Application.Terminate;
gruss litotes |
Re: Programmprozess läuft weiter, obwohl "Windows"
ein einfaches "Close()" sollte zum schließen genügen.
|
Re: Programmprozess läuft weiter, obwohl "Windows"
Delphi-Quellcode:
Was passiert bei einem simplen close;?
Application.Terminate;
Terminate klingt so brutal, das mag ich persönlich gar nicht. |
Re: Programmprozess läuft weiter, obwohl "Windows"
Hallo,
weiteres Debuggen hat ergeben, dass mein Programm anscheinend an folgender Stelle hängt (nachdem ich Beendet habe per Windows-Kreuz): im CPU-Fenster sieht man ntdll.kiFastSystemCallRet Kann damit jemand was anfangen? litotes |
Re: Programmprozess läuft weiter, obwohl "Windows"
Hallo,
setz mal einen Breakpoint auf FormDestroy das Hauptforms. Heiko |
Re: Programmprozess läuft weiter, obwohl "Windows"
Hallo,
@hoika: den Breakpoint habe ich gesetzt, obwohl onDestroy bisher gar nicht existiert hat. Ich habe also mal label1.caption := 'test'; reingeschrieben. Beim durchsteppen kommt erst der ganze label caption Kram, und dann landet er, auch bei anderen Befehlen (also close() statt label.caption) bei dem Mutex-Befehl:
Delphi-Quellcode:
Dieser Code steht bei meiner "program"-datei, also der "Programmname.dpr".
const
MutexName = 'Helfomat'; //-->der Name, unter dem Windows dein Programm anspricht var hMutex: THandle; begin hMutex := CreateMutex(NIL, True, MutexName); //-->Versuch, dem Programm den obigen Mutex zuzuweisen if (hMutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then begin CloseHandle(hMutex); halt; end; Application.Initialize; Application.CreateForm(TF_Navigation_705_Abfrage, F_Navigation_705_Abfrage); Application.CreateForm(TF_Hier_Starten, F_Hier_Starten); Application.CreateForm(TF_SM, F_SM); Application.Run; CloseHandle(hMutex); Merkwürdigerweise läuft der Prozess auch nur weiter, nachdem ich ins zweite Formular gewechselt bin. Wenn ich nur Form1 aufmache, ist alles ok. Noch jemand ne gute Idee? litotes |
Re: Programmprozess läuft weiter, obwohl "Windows"
Hallo,
ich hab den Fehler noch ein wenig weiter eingeengt. Mein Hauptformular lässt sich schließen, und der Prozess wird sauber beendet. Der Fehler (Prozess läuft weiter) tritt nach dem Wechsel zum 2. Formular auf. Und es ist völlig egal, ob ich ein völlig leeres Formular aufrufe, und wie ich es aufrufe (über create dynamisch zur Laufzeit, oder gleich zu Beginn immer vorhanden). Es kann also IMHO nicht an dem liegen, was im 2. Formular aufgerufen wird, oder? /edit: Ein letzter verzweifelter Test hat ergeben, dass ein völlig neues Projekt (!), das nur aus 2 leeren Form1 und Form2 mit einem Button dazwischen und hide; Form2.show besteht, denselben Fehler zeigt. Kann das jemand mal auf seinem Computer nachvollziehen? Sprich, auf Form2 wechseln, über das Kreuz schließen und prüfen, ob der Prozess noch läuft? Ich werde immer ratloser... litotes |
AW: Programmprozess läuft weiter, obwohl "Windows"-Kreuz gedrück
Hallo,
es ist schon viel zeit vergangen seit dem letzten Post hier, aber eine Lösung war nicht dabei, wie es aussieht, und da ich ein ähnliches Problem habe, dachte ich, ich poste mal hier. Bei mir sieht es folgendermaßen aus: - Eine mit Delphi 2007 erstellte Anwendung - Auf Betriebssystemen außer Windows 7 scheint alles zu funktionieren - Auf Windows 7 auch, aber nur solange kein Fehler während der Laufzeit auftritt. Passiert dies, z.B. eine Zugriffsverletzung, bleibt der Prozess nach dem Beeden in der Prozessliste und muss manuell beendet werden. Ohne Fehler geht es. Gibt es irgendwelche neuen Erkenntnisse, ähnliche Erfahrungen oder Ideen in dem Zusammenhang? Schöne Grüße, "shadowman" |
AW: Programmprozess läuft weiter, obwohl "Windows"-Kreuz gedrück
Dann behandle den Fehler (Exception), wenn er sich nicht vermeiden lässt.
|
AW: Programmprozess läuft weiter, obwohl "Windows"-Kreuz gedrück
Zitat:
Schließt Du die MainForm mit dem Windows-Kreuz wird die Applikation beendet. Schließt Du eine Form, die nicht die MainForm ist, mit dem Kreuz, dann wird nur das Formular geschlossen und nicht die Anwendung. Das die Anwendung dann noch läuft, ist ja klar, da die MainForm noch versteckt ist. Willst Du beim Klick auf das Kreuz in Form2 auch die Applikation beenden, dann entweder MainForm.Close aufrufen oder direkt Application.Terminate. Das Verhalten ist aber imho seit Jahren so. |
AW: Programmprozess läuft weiter, obwohl "Windows"-Kreuz gedrück
Hallo Luckie,
das ist klar, natürlich werden die Fehler, die auffallen, behoben :) Aber es kann ja sein, dass man etwas übersieht und es später beim Kunden zu diesem Verhalten kommt. Daher würde ich gerne sicherstellen, dass das Programm tatsächlich beendet wird, wenn auf Beenden klickt. [edit]zumal es ja bei anderen Betriebssystemen auch nach einem Fehler funktioniert[/edit] |
AW: Programmprozess läuft weiter, obwohl "Windows"-Kreuz gedrück
Ich hatte das Problem einmal in einer Firebird-Anwendung, als eine
![]() |
AW: Programmprozess läuft weiter, obwohl "Windows"-Kreuz gedrück
Interessant, denn auch meine Anwendung ist eine Firebird-Anwendung und es wird auch was mit Events gemacht.
Allerdings läuft in meinem Fall der Datenbankdienst, also nichts mit embedded-dlls... Werde es mir aber genauer angucken. Danke für den Hinweis! |
AW: Programmprozess läuft weiter, obwohl "Windows"-Kreuz gedrück
Scheint nicht damit zusammenzuhängen leider.
Alles wird vor Beenden deregistriert usw. Habe jetzt mehrere Rechner und VMs ausprobiert und es ist doch nicht nur unter Windowws 7 so. Auch auf einer Vista-VM tritt das Problem auf. Auf dem Entwicklungsrechner (auch Vista), läuft widerrum alles wie es soll. Macht einen schon ein wenig ratlos... |
AW: Programmprozess läuft weiter, obwohl "Windows"-Kreuz gedrück
Moin, ich habe gerade eben erst gesehen, dass das Zitat, auf das sich Muhkuh bezieht schon mehr als 3 Jahre alt ist. Ich habe angenommen, dass der aktuelle Threadnutzer das überlesen hat, und Muhkuhs Erklärung wie die Faust auf's Auge passt.
MfG Fabian |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz