Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Thread herausfinden über ThreadID (https://www.delphipraxis.net/164602-thread-herausfinden-ueber-threadid.html)

AJ_Oldendorf 21. Nov 2011 13:43

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

himitsu 21. Nov 2011 14:00

AW: Thread herausfinden über ThreadID
 
Gibt es Delphi-Referenz durchsuchenTThread.NameThreadForDebugging schon in D2009?

Delphi-Quellcode:
MyThread := TMyThread.Create(...);
MyThread.NameThreadForDebugging(MyThread.ClassName + ' dies und das');
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.
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.

AJ_Oldendorf 21. Nov 2011 14:11

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

AJ_Oldendorf 21. Nov 2011 14:32

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

mjustin 16. Dez 2013 15:47

AW: Thread herausfinden über ThreadID
 
Zitat:

Zitat von himitsu (Beitrag 1137210)
Gibt es Delphi-Referenz durchsuchenTThread.NameThreadForDebugging schon in D2009?

Anscheinend nicht. Obwohl der EDN Artikel zu diesem Thema besagt
Zitat:

Delphi’s debugging features implemented specifically with multithreading programming in mind. Sadly, most of them are only available in newer Delphis (from 2009 onwards).
habe ich die Funktion Delphi-Referenz durchsuchenTThread.NameThreadForDebugging in Delphi 2009 leider nicht finden können.
Der Artikel enthält aber einen Ersatz, basierend auf der OmniThreadLibrary (procedure SetThreadName) mit Quelltext.

himitsu 16. Dez 2013 16:08

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:
{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;
[edit]
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 08:37 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