Anzahl der Threads des eigenen Prozesses ermitteln
-
Gibt es eine einfache Möglichkeit die Anzahl der Threads im eigenen Prozess zu ermitteln?
Ich kenne nur die PSAPI Funktionen, also Snapshot machen und Threads enumerieren + mitzählen.
Gibt es eine schnellere (Laufzeit) Möglichkeit?
-
Kannst ja intern mitzählen wenn es Dein eigener Prozess ist!?
Verstehe aber wohl den Hintergrund nicht.
-
Du könntest Dir den logischen Speicher anschauen und nach Stack-Speicher suchen
so viele Stacks wie es gibt, gibt es auch Threads
Ganz grob siehe:
http://blog.kalmbachnet.de/?postid=9
Wie Du aber den Stack-Heap sicher identifizierst, kann ich Dir nicht sagen... war nur eine Idee, wie es schneller gehen könnte...PS: Natürlich könntest Du noch auf undokumentierte Strukturen / Funktionen zugreifen; aber das ist nicht sehr zielführend...
-
tar schrieb:
Kannst ja intern mitzählen wenn es Dein eigener Prozess ist!?
Dazu müsste ich die THREAD_ATTACH/THREAD_DETACH irgendwie mitbekommen.
Dazu gibt es zwar diverse Tricks (Helper-DLL, CRT-Tables modifizieren), aber die sind alle mehr oder weniger "hässlich", und vor allem nicht in 5 Minuten implementiertVerstehe aber wohl den Hintergrund nicht.
Ich will das einfach als Debug-Info ausgeben.
Es geht um ne Software die sehr lange läuft (tagelang, evtl. wochenlang), und die soll a) auf dem Schirm als Debug-Info diverse Dinge anzeigen und b) diese Infos periodisch in ein Logfile schreiben.
Die Anzahl der Threads wäre interessant, da wir z.B. ADO (das alte ohne .NET) verwenden, und da in Vergangenheit schon Probleme mit "verwaisten" Threads hatten.
Und nicht nur mit ADO, man kann auch schnell selbst Unfug machen durch den sich Threads anhäufen die eigentlich gar nicht laufen sollten.Wenn man Fehler ala "nach 2 Tagen geht nix mehr - wenn ich auf X drücke kommt einfach nix" sucht kann das recht hilfreich sein.
-
hustbaer schrieb:
Ich kenne nur die PSAPI Funktionen, also Snapshot machen und Threads enumerieren + mitzählen.
Aber die Funktionen aus <tlHelp32.h> kennst du auch, oder?
Also CreateToolHelp32Snapshot und anschließend mit Process32First/Next die PROCESSENTRY32 - Struktur füllen lassen.DWORD processID = GetCurrentProcessId(); HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, processID); if(snap!=INVALID_HANDLE_VALUE) { PROCESSENTRY32 entry={0}; entry.dwSize = sizeof(PROCESSENTRY32); if(Process32First(snap, &entry)) { do { if(entry.th32ProcessID == processID) { // entry.cntThreads abfragen break; } } while(Process32Next(snap, &entry)); } CloseHandle(snap); }
Ich weiß natürlich nicht, ob dies für deine Zwecke schnell genug ist.
Jochen Kalmbach schrieb:
so viele Stacks wie es gibt, gibt es auch Threads
Ist das so? Ich meine irgendwann gelesen zu haben, dass jeder Thread zwei Stacks besitzt, jeweils einen für das Ausführen im Kernel- bzw. Usermode.
Ich müsste aber noch einmal nachschauen...
-
@Vicious Falcon:
Mein Fehler.
Ja ich meinte die Toolhelp Funktionen - hab das verwechselt.Mit der PSAPI geht das gar nicht, mit der kann man bloss Module enumerieren und diverse Statistiken zu Prozessen abfragen -- aber was ich gesehen habe nichts bezüglich Thread-Anzahl.
Also ja, die kenne ich. Was Geschwindigkeit angeht... ausprobiert hab' ich es noch nicht, vielleicht sollte ich das einfach mal machen. Hat aber keine hohe Priorität, und da ich im Moment bis oben hin zu mit Arbeit bin...
Ich wollte nur mal nachfragen ob es nicht doch irgendwo eine QueryXyzInfo() Funktion gibt, mit der man das einfach und schnell rausbekommt, die ich übersehen habe.