Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programmprozess läuft weiter, obwohl "Windows"-Kreuz gedrück (https://www.delphipraxis.net/96563-programmprozess-laeuft-weiter-obwohl-windows-kreuz-gedrueck.html)

litotes 26. Jul 2007 22:00


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...

Bernhard Geyer 26. Jul 2007 22:05

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?

litotes 26. Jul 2007 22:09

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

Whookie 26. Jul 2007 22:37

Re: Programmprozess läuft weiter, obwohl "Windows"
 
Verwendest Du irgentwelche Schleifen, die nicht enden _könnten_ und in denen Du ProcessMessages aufrufst?

Luckie 26. Jul 2007 22:46

Re: Programmprozess läuft weiter, obwohl "Windows"
 
Was steht in OnClose, OnCloseQuery, OnDestroy?

Christian Seehase 26. Jul 2007 22:47

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?

Bernhard Geyer 26. Jul 2007 22:48

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.

litotes 27. Jul 2007 09:18

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:
  If HotKeySet then
      UnRegisterHotKey(Self.Handle, HotKeyID);
2. Es gibt 2x processMessages, einmal in einer Dateisuche, und dann in einem Test,
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:
Screen.ActiveForm.Release;
freigegeben.

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:
Screen.ActiveForm.Release;
Das sieht so aus, dass bei jedem Formularwechsel folgendes passiert in onHide:
Delphi-Quellcode:
speicherfreigeben();
und in einem Formular sind alle Methoden gesammelt. Dort ist auch 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

hoika 27. Jul 2007 09:25

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

litotes 27. Jul 2007 09:28

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

DeddyH 27. Jul 2007 09:35

Re: Programmprozess läuft weiter, obwohl "Windows"
 
Zitat:

Zitat von litotes
Meine Anwendung hat einen programmierten Ende-Button, der auch tadellos funktioniert.

Dann zeig doch mal den Source, der bei Klick ausgeführt wird.

litotes 27. Jul 2007 09:47

Re: Programmprozess läuft weiter, obwohl "Windows"
 
Hi,

der Ende-Button ist ein simples onClick auf einen Button, mit:
Delphi-Quellcode:
Application.Terminate;
So jedenfalls hat meine Forumssuche ergeben, ist der beste Weg, zu beenden.

gruss

litotes

SirThornberry 27. Jul 2007 09:59

Re: Programmprozess läuft weiter, obwohl "Windows"
 
ein einfaches "Close()" sollte zum schließen genügen.

KesseK 27. Jul 2007 10:00

Re: Programmprozess läuft weiter, obwohl "Windows"
 
Delphi-Quellcode:
Application.Terminate;
Was passiert bei einem simplen close;?

Terminate klingt so brutal, das mag ich persönlich gar nicht.

litotes 27. Jul 2007 10:34

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

hoika 27. Jul 2007 10:53

Re: Programmprozess läuft weiter, obwohl "Windows"
 
Hallo,

setz mal einen Breakpoint auf FormDestroy das Hauptforms.


Heiko

litotes 27. Jul 2007 11:25

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:
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);
Dieser Code steht bei meiner "program"-datei, also der "Programmname.dpr".

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

litotes 27. Jul 2007 14:38

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

shadowman 9. Okt 2010 11:47

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"

Luckie 9. Okt 2010 11:53

AW: Programmprozess läuft weiter, obwohl "Windows"-Kreuz gedrück
 
Dann behandle den Fehler (Exception), wenn er sich nicht vermeiden lässt.

Die Muhkuh 9. Okt 2010 11:57

AW: Programmprozess läuft weiter, obwohl "Windows"-Kreuz gedrück
 
Zitat:

/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?
Klar, das ist kein Bug, das ist imho schon immer so:

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.

shadowman 9. Okt 2010 11:58

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]

stahli 9. Okt 2010 13:09

AW: Programmprozess läuft weiter, obwohl "Windows"-Kreuz gedrück
 
Ich hatte das Problem einmal in einer Firebird-Anwendung, als eine ungenutze IBEvent in meiner Anwendung enthalten war...

shadowman 9. Okt 2010 13:29

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!

shadowman 9. Okt 2010 14:24

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...

xZise 9. Okt 2010 14:31

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:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf