Wie herausfinden welches modul Thread gestartet hat?
-
Hi!
Ich versuche gerade mit ToolhelpSnapshot und Thread32First bzw Next Threads zu enumerieren und einen Thread zu beenden den ich in einer dll starte.
Diese dll wird von meinem Testprogramm geladen. Der Thread in besagter dll durchläuft eine dauerschleife die alle 2 sek etwas in die console schreibt.Nun bekomme ich zwar in der THREADENTRY32 struktur die Thread ID und die OwnerProcessID und kann den thread dann beenden mit OpenThread und TerminateThread aber ... (nun kommt die eigentliche frage)
Wenn in meinem testprogramm nun beispielsweise 2 threads laufen und ich möchte nur den thread beenden der von meiner dll gestartet wird, wie kann ich unterscheiden welcher der thread der dll ist, und welcher nicht?
Ich bedanke mich schonmal im voraus in der hoffnung, dass mir jemand helfen kann

mfg
-
ein thread gehört doch nicht irgendeiner dll sondern dem prozess.
-
Wenn ich mir ein programm in einem programm wie Process Hacker (ja das programm heisst wirklich so =P) genauer anschaue steht bei den threads etwas wie:
ThreadID Context Switches Start Adress Priority 7456 0 Kernel32.dll!CreateThread+0x32 Normal 4100 0 WINMM.dll!timeGetSystemTime+0x44 Normal(Als Beispiel nur wahrlos zusammengestellt, hat keinen zusammenhang mit meinem programm ^^)
Das was dort Start Adress genannt wird, das versuch ich rauszubekommen, weiss jmd wie das geht?
-
Du musst den Stack "walken":
http://stackwalker.codeplex.com/
-
oh das klingt interessant, übersteigt wahrscheinlich meine bisherigen möglichkeiten aber man kann ja lernen, nich wahr? ^^ Danke für den hinweis Jochen Kalmbach das muss ich mir nun erstmal genau anschauen scheinen ja nur nur ein zwei zeilen code zu sein xD
-
+ Symbole... ohne das wirst Du nicht weit kommen...
OT: Ganz abgesehen davon ist vermutlich Dein Ansatz für Deine Problemstellung der Falsche...
Wesentlich besser wäre es, wenn Dein Thread ein Names-Event abfragen würde, welches Du setzt, wenn Du den Thread beenden willst...
-
Erstaml eine berichtigung zu meinem letzten post .. ich meinte natürlich "nicht nur 2 zeilen code" xD
Um dir dann zu antworten Jochen, hab ich das nich ganz verstanden..
Ich möchte davon ausgehen dass die threads die ich beende, wie man meinem ersten post entnehmen kann, nicht im selben prozess sind sondern in einem anderen und man muss davon ausgehen, dass die Threads die beendet werden nicht von mir geschrieben sind.Wenn ich dich richtig verstanden habe müccte ich beim erstellen des Threads de rbeendet werden soll ein namens event aufrufen, dass ich dann beim beenden abfragen kann?
Wenn das so ist wird das nciht gehen da ich ja, wie schon gesagt, davon ausgehen will dass ich die Threads nicht selbst geschrieben habe. (Es soll also bei jedem Thread eines bestimmten Moduls funktionieren. Das Modul soll man später angeben können aber das ist eine andere geschichte ^^)
-
Es macht keinen Sinn von aussen einfach Threads eines Prozesses zu beenden. Dies kann zu Dead-Locks führen... Beende den ganzen Prozess und starte ihn neu.
-
Dass der Sinn dahinter in Frage steht ist mir klar, aber das ist dann meine sorge ich möchte das nunmal hinbekommen und ich weiss dass es geht, nur wie noch nicht.
Also würde das mit dem StackWalk gehen? Wenn ja dann probier ichs damit, wenn nicht wie war das mit den name events gemeint?
-
Mit den Named-Events geht es nur, wenn Du den Source-Code zu dem Thread hast.
-
Und geht es mit dem StackWalk??
-
Ja, aber nur, wenn Du Symbole hast... sonst kann es sein, dass der Callstack nict komplett aufgelöst werden kann...
-
sry für die blöde frage aber .. symbole? was meinst du damit genau?
-
PDB-Dateien für die EXEn/DLLn...
Probier es einfach aus, dann siehst Du wie weit Du kommst...