AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

HauptThread eines Processes

Ein Thema von Meta777 · begonnen am 4. Mai 2008 · letzter Beitrag vom 6. Mai 2008
Antwort Antwort
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

HauptThread eines Processes

  Alt 4. Mai 2008, 18:03
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
  Mit Zitat antworten Zitat
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

Re: HauptThread eines Processes

  Alt 4. Mai 2008, 18:29
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
  Mit Zitat antworten Zitat
wido

Registriert seit: 2. Jan 2006
122 Beiträge
 
#3

Re: HauptThread eines Processes

  Alt 4. Mai 2008, 19:16
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 .
  Mit Zitat antworten Zitat
Meta777

Registriert seit: 8. Sep 2004
Ort: Magdeburg
248 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

Re: HauptThread eines Processes

  Alt 5. Mai 2008, 23:30
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....

Shalom
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.011 Beiträge
 
Delphi 12 Athens
 
#5

Re: HauptThread eines Processes

  Alt 5. Mai 2008, 23:42
notfalls sende doch WM_CLOSE einfach an alle Threads der Anwendung

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: HauptThread eines Processes

  Alt 6. Mai 2008, 09:10
Zitat von himitsu:
notfalls sende doch WM_CLOSE einfach an alle Threads der Anwendung
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.011 Beiträge
 
Delphi 12 Athens
 
#7

Re: HauptThread eines Processes

  Alt 6. Mai 2008, 09:23
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

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: HauptThread eines Processes

  Alt 6. Mai 2008, 09:30
Zitat von himitsu:
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
Und was macht ein Thread ohne Fenster mit einer Fensternachricht?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.011 Beiträge
 
Delphi 12 Athens
 
#9

Re: HauptThread eines Processes

  Alt 6. Mai 2008, 09:32
Ich denk mal die arme Nachricht versauert dort, bis das Programm beendet wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 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