AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Thread herausfinden über ThreadID
Thema durchsuchen
Ansicht
Themen-Optionen

Thread herausfinden über ThreadID

Ein Thema von AJ_Oldendorf · begonnen am 21. Nov 2011 · letzter Beitrag vom 16. Dez 2013
Antwort Antwort
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#1

Thread herausfinden über ThreadID

  Alt 21. Nov 2011, 13:43
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Thread herausfinden über ThreadID

  Alt 21. Nov 2011, 14:00
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (21. Nov 2011 um 14:05 Uhr)
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Thread herausfinden über ThreadID

  Alt 21. Nov 2011, 14:11
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

Geändert von AJ_Oldendorf (21. Nov 2011 um 14:18 Uhr)
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
Ort: Stadthagen
384 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Thread herausfinden über ThreadID

  Alt 21. Nov 2011, 14:32
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
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Thread herausfinden über ThreadID

  Alt 16. Dez 2013, 15:47
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.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Thread herausfinden über ThreadID

  Alt 16. Dez 2013, 16:08
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (16. Dez 2013 um 16:13 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:02 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