![]() |
Thread herausfinden über ThreadID
Hallo zusammen,
ich habe folgendes Problem: Es handelt sich um eine sehr umfangreiche Anwendung welche ca. 220 Thread beinhaltet (laut TaskManager). Jetzt habe ich gesehen, dass ich aller 10sek immer ein Peak in der CPU Auslastung habe (ca. 25% Auslastung) und diese sofort wieder weg geht. Da wollte ich jetzt mal hinterher und habe mittlerweile über den Process Explorer von SysInternals die ThreadID des Threads herausgefunden, welcher dann immer die CPU Auslastung erzeugt. Ich habe in meiner Anwendung alle registrierten Threads durchsucht aber diese ID ist nicht vorhanden. Ich habe auch alle möglichen "10sek Aufrufe" (á la Timer und ähnlichen) ausgeklammert und immernoch. Gibt es eine Möglichkeit, eine "Mini-Anwendung" zu schreiben die mir zu einem Prozess (laufende Anwendung im Hintergrund) und der ThreadID (mit Sysinternals ermittelt) den Threadname oder ähnliches zurück liefert, damit ich mal weiter forschen kann wer der Auslöser ist und warum? Ich hoffe ihr könnt mir helfen. Viele Grüße Alex |
AW: Thread herausfinden über ThreadID
Gibt es
![]()
Delphi-Quellcode:
Dafür muß das Programm aber im Debugger ausgeführt werden, denn dieses löst eine stille Exception aus, welche "nur" vom Delphi-Debugger beachtet wird.
MyThread := TMyThread.Create(...);
MyThread.NameThreadForDebugging(MyThread.ClassName + ' dies und das'); Dann mit dem Process Explorer die ThreadID auslesen, im Debugger das Programm anhalten, in der Threadliste nach der ThreadID suchen und dort steht dann der angegebene Name. Oder du logst in deinem Programm die Threaderstellungen und ihre IDs mit, um dann dort drin zu suchen. Natürlich kannste das Programm auch im Debugger laufen lassen, hälst es ebenfalls an, sobald du die ID kennst und versuchst dann den entsprechenden Thread zu debuggen, bzw. schaust an welcher Codeadresse er gerade steht und wozu das dann im Quellcode gehört. |
AW: Thread herausfinden über ThreadID
Stimmt, über die Threadliste in der IDE bin ich jetzt darauf gestoßen, dass es anscheind der Main-Thread ist.
Habt ihr spontan eine Idee was das sein könnte bzw. was zu so einem "Verhalten" führen könnte?! Danke und Grüße Alex Edit: Wenn ich die ID habe und mich in der IDE befinde, wie debugge ich dann diesen einen Thread, sodass ich den einen Peak aller 10sek finde?! Grüße Edit2: Also den Thread im CPU Fenster habe ich gefunden, es scheint wirklich der MainThread zu sein, weil er z.B. bei TApplication.Idle lang geht usw. Nur wie komme ich dahinter was aller 10sek passiert? Man kann wirklich die Uhr danach stellen... Ich fange mal an bestimmte Programmteile komplett abzuklemmen... Grüße |
AW: Thread herausfinden über ThreadID
Danke für die Anregungen @himitsu.
Ich habs gefunden, da war noch ein Timer der aller 10sek auf der Festplatte ein paar Dateien analysiert hat... Danke und viele Grüße Alex |
AW: Thread herausfinden über ThreadID
Zitat:
![]() Zitat:
![]() Der Artikel enthält aber einen Ersatz, basierend auf der OmniThreadLibrary (procedure SetThreadName) mit Quelltext. |
AW: Thread herausfinden über ThreadID
Im Prinzip macht das Ding nicht viel, außer eine "stille" Exception loszuwerden, welche vom Debugger ausgewertet wird. (wenn der Debugger sie kennt und drauf reagiert)
Delphi-Quellcode:
[edit]
{class} procedure {TThread.}NameThreadForDebugging(AThreadName: AnsiString; AThreadID: TThreadID = TThreadID(-1));
type TThreadNameInfo = record FType: LongWord; // must be 0x1000 FName: PAnsiChar; // pointer to name (in user address space) FThreadID: LongWord; // thread ID (-1 indicates caller thread) FFlags: LongWord; // reserved for future use, must be zero end; var ThreadNameInfo: TThreadNameInfo; begin if IsDebuggerPresent then begin ThreadNameInfo.FType := $1000; ThreadNameInfo.FName := PAnsiChar(AThreadName); ThreadNameInfo.FThreadID := AThreadID; ThreadNameInfo.FFlags := 0; try RaiseException($406D1388, 0, SizeOf(ThreadNameInfo) div SizeOf(LongWord), @ThreadNameInfo); except end; end; end; Seh grade, daß wurde auch schon in dem Artikel erwähnt. Also hatte Emba sich das von der OmniThreadLibrary raubkopiert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz