2016-07-27 9 views
0

Ich habe diesen Code, der alle Threads durchläuft. Ich möchte die Threads nur von meinem eigenen Prozess erhalten, ohne alle Threads durchlaufen zu müssen, die auf dem System laufen.Wie können Sie Threads im selben Prozess auflisten?

var 
    SnapProcHandle: THandle; 
    NextProc  : Boolean; 
    TThreadEntry : TThreadEntry32; 
begin 
    SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); 
    Result := (SnapProcHandle <> INVALID_HANDLE_VALUE); 
    if Result then 
    try 
    TThreadEntry.dwSize := SizeOf(TThreadEntry); 
    NextProc := Thread32First(SnapProcHandle, TThreadEntry); 
    while NextProc do 
    begin 
     if TThreadEntry.th32OwnerProcessID = PID then 
     begin 
     Memo1.Lines.Add('Thread ID  '+IntToStr(TThreadEntry.th32ThreadID)); 
     Memo1.Lines.Add('base priority '+inttostr(TThreadEntry.tpBasePri)); 
     Memo1.Lines.Add('delta priority '+inttostr(TThreadEntry.tpBasePri)); 
     end; 
     NextProc := Thread32Next(SnapProcHandle, TThreadEntry); 
    end; 
    finally 
    CloseHandle(SnapProcHandle); 
    end; 
end; 
+0

Ihr Englisch ist in Ordnung, aber Ihr Code ist nicht lesbar. Bearbeiten Sie die Frage, lesen Sie die Hilfe zum Bearbeiten eines Formulars den Code. Verbringe etwas Zeit damit. Gib nicht nach 20 Jahren auf wie so viele vor dir. –

+0

Dupes: http://StackOverflow.com/q/2055642/800214 und http://StackOverflow.com/Questions/3809708/Running-Threads-count – whosrdaddy

+0

Es ist auch schwierig, die Frage zu verstehen, und wie der Code sich darauf bezieht . Was erwarten Sie von dem Code? Was tut es. –

Antwort

0

Sie können dies mit WMI (Windows MIcrosoft Instrumentation) tun. Here there are an article, die erklären, wie alle Threads abgerufen werden, die von einem Prozess ausgeführt werden. Der Artikel ist in Spanisch, aber Sie können eine automatische Übersetzung verwenden, um den Code zu sehen und Beispiele herunterzuladen.

Mit WMI können Sie alle Informationen eines Prozesses mit der Klasse Win32_Process class abrufen. Sie können versuchen, in einer Konsole einen Coomand wie folgt auszuführen, um Informationen dieser Klasse zu erhalten.

WMIC Prozess, wo name = "bds.exe" GET-Name, Beschreibung, ProcessId, Thread, Griff

enter image description here

Damit Sie Informationen von Verfahren erhalten.

Der zweite Schritt, wenn "Wie die Threads abgerufen werden, die einem Prozess zugeordnet sind". Sie können dies mit dem Win32_Thread class tun.

Wenn Sie eine Abfrage wie folgt starten:

SELECT * FROM WIN32_THREAD WHERE ProcessHandle = 10740

Sie erhalten alle Threads des Prozesses 10740 (siehe ProcessId der ersten Abfrage).

Grüße.

+0

Gute Alternative, mochte die lib und daher die Antwort akzeptieren. – Mutha

+0

@Mutha - Dies vermeidet nicht das Abrufen aller Threads wie aus dem SQL ersichtlich. Nur, es ist nicht Ihr Code, der Looping ist, sondern WMI. –

2

Sie bereits wissen, wie die Fäden für einen bestimmten Prozess zu filtern, da der Code bereits tut genau das:

if TThreadEntry.th32OwnerProcessID = PID then 

Alles was Sie brauchen die PID für den anrufenden Prozess. Verwenden Sie GetCurrentProcessId(), um diesen Wert zu erhalten.

Leider CreateToolhelp32Snapshot() können Sie nicht den Snapshot auf einen bestimmten Prozess beschränken, wenn TH32CS_SNAPTHREAD verwendet, enthält der Snapshot alle Threads im System, so dass Sie sie auf ihre jeweiligen PIDs filtern müssen, während Sie durchlaufen.

+0

konnte die Schleife nicht verhindern? – Mutha

+0

Welches Problem verursacht die Schleife? –

+1

Sie können die Schleife nicht vermeiden, wie die Antwort erklärt. –