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 HauptThread eines Processes (https://www.delphipraxis.net/113207-hauptthread-eines-processes.html)

Meta777 4. Mai 2008 17:03


HauptThread eines Processes
 
huhu...

gibt es eine Möglichkeit den MainThread einer Anwendung zu ermitteln?
Ich würde "möglichst" sauber eine Anwendung beenden wollen. Auf TerminateProcess will ich dabei nicht zurückgreifen...

TIA

Shalom

Meta777 4. Mai 2008 17:29

Re: HauptThread eines Processes
 
Man könnte doch mit "CreateToolhelp32Snapshot()" alle Threads eines Processes ermitteln und eventuell anhand der ThreadId den MainThread ermitteln (müsste ja der mit der gerinsten Id sein, or??)
Leider scheint das erst ab W2k zu funken (laut msdn)...
Naja, werd das mal ausprobieren - später... Fals noch jemand ne alternative Möglichkeit kennt, bitte posten :)

Shalom

wido 4. Mai 2008 18:16

Re: HauptThread eines Processes
 
Für die Enumerierung von Threads auf NT 4.x (und evtl. 3.x) Systemen fallen mir 2 Möglichkeiten ein:
PDH (MSDN-Library durchsuchenPdhAddCounter) und Native API (Bei Google suchenNtQuerySystemInformation).

Davon abgesehen halt ich dein Vorhaben für ziemlich sinnbefreit. TerminateProcess ist letztlich die Methode, mit der Windows alle Prozesse terminiert. Auch wenn Du alle Threads terminierst, wird Windows zum beenden des Prozesses letztlich TerminateProcess aufrufen. Also wieso nicht gleich benutzen?

Achja ... soetwas wie einen "MainThread" gibt es meines Wissens nach nicht wirklich. Ein Prozess ist so lange aktiv, bis alle Threads beendet wurden. Also selbst wenn Du den ersten Thread terminierst, rennt die Anwendung brav weiter sofern noch andere Threads existieren. Kann mich da aber durchaus irren. Bin grad dabei mich vom Umzugsstreß zu erholen und hab ne Weile nicht gepennt ;).

Meta777 5. Mai 2008 22:30

Re: HauptThread eines Processes
 
ich weiß,
der Gedanke war der, dass wenn der Thread der die Hauptnachrichtenschleife beinhaltet eine WM_Close empfängt <müsste> ja eigentlich die Anwendung sauber beendet werden - wenn keine Dialoge "im Weg stehen"... Terminieren will ich den Thread ja nicht, nur eine Message senden.... :wink:

Shalom

himitsu 5. Mai 2008 22:42

Re: HauptThread eines Processes
 
notfalls sende doch WM_CLOSE einfach an alle Threads der Anwendung :stupid:

Aber geh lieber über TerminateProcess, den WM_CLOSE wird auch nur von der Nachrichtenschleife verarbeitet und letztendlich wird wieder TerminateProcess aufgerufen.

PS: ein DelphiProgramm beendet nur die Anwendung, wenn WM_CLOSE über das MainForm eingeht.

Also wenn WM_CLOSE ohne Form (nur direkt an Nachrichtenschleife gesendet), oder wenn WM_CLOSE an Nicht-MainForm sollte keine Delphi-Anwendung beenden.

Luckie 6. Mai 2008 08:10

Re: HauptThread eines Processes
 
Zitat:

Zitat von himitsu
notfalls sende doch WM_CLOSE einfach an alle Threads der Anwendung :stupid:

Das setzt aber voraus, dass alle Threads ein Fenster haben, an das man diese Fensternachricht schicken könnte.

Zitat:

Aber geh lieber über TerminateProcess, den WM_CLOSE wird auch nur von der Nachrichtenschleife verarbeitet und letztendlich wird wieder TerminateProcess aufgerufen.
Aber es wird zu erst aufgeräumt, sprich die Referenzenzähler der geladenen DLLs werden dekrementiert usw.

So gesehen, gibt es keine sichere und saubere Möglichkeit einen fremden Prozess zu beenden. Stellt sich die Frage, ob das denn wirklich notwendig ist. Und wenn es wirkölich notwendig ist, sollte man das nur im Notfall machen. Siehe dazu die Anmerkungen aus dem SDK:
Zitat:

The TerminateProcess function is used to unconditionally cause a process to exit. The state of global data maintained by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used rather than ExitProcess.

TerminateProcess initiates termination and returns immediately. This stops execution of all threads within the process and requests cancellation of all pending I/O. The terminated process cannot exit until all pending I/O has been completed or canceled.

A process cannot prevent itself from being terminated.

himitsu 6. Mai 2008 08:23

Re: HauptThread eines Processes
 
Zitat:

Zitat von Luckie
Das setzt aber voraus, dass alle Threads ein Fenster haben, an das man diese Fensternachricht schicken könnte.

Nö, denn jede Thread hat erstmal seine eigene MessageQueue, welche man per PostThreadMessage ansprechen kann ... bleibt nur die Frage ob für den Thread dann auch eine MessageLoop existiert, welche diese Message überhaupt verarbeitet :stupid:

Fensternachrichten ala PostMessage gelangen in die MessageQueue des Threads in dem das Fenster erstellt wurde (oder womit das Fenster verknüpft wurde)
und SendMessage geht direkt an die Fensterprozedur.

Luckie 6. Mai 2008 08:30

Re: HauptThread eines Processes
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von Luckie
Das setzt aber voraus, dass alle Threads ein Fenster haben, an das man diese Fensternachricht schicken könnte.

Nö, denn jede Thread hat erstmal seine eigene MessageQueue, welche man per PostThreadMessage ansprechen kann ... bleibt nur die Frage ob für den Thread dann auch eine MessageLoop existiert, welche diese Message überhaupt verarbeitet :stupid:

Und was macht ein Thread ohne Fenster mit einer Fensternachricht?

himitsu 6. Mai 2008 08:32

Re: HauptThread eines Processes
 
Ich denk mal die arme Nachricht versauert dort, bis das Programm beendet wird. :cry:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 Uhr.

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