2016-07-27 10 views
0

私はすべてのスレッドを実行するこのコードを持っています。私は自分のプロセスからのみスレッドを取得したいと思います。システム上で実行されているすべてのスレッドをループする必要はありません。スレッドを同じプロセスで一覧表示する方法は?

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

あなたの英語は問題ありませんが、あなたのコードは読めません。質問を編集し、コードの書式を編集する際のヘルプを読んでください。これを行うには時間をかけてください。あなたの前に非常に多くの20の後にあきらめないでください。 –

+0

dupes:http://stackoverflow.com/q/2055642/800214およびhttp://stackoverflow.com/questions/3809708/running-threads-count – whosrdaddy

+0

質問とそのコードがどのように関連しているかを理解することも難しい。コードが何を期待していますか?それは何をするためのものか。 –

答えて

0

これはWMI(Windows MIcrosoft Instrumentation)で実行できます。 Here there are an articleは、1つのプロセスで実行されているすべてのスレッドを取得する方法を説明しています。記事はスペイン語ですが、authomatic translationを使用してコードを表示してサンプルをダウンロードすることができます。

WMIを使用すると、クラスWin32_Process classを使用してプロセスのすべての情報を取得できます。 このクラスの情報を得るために、このようなcoomをコンソールで実行することができます。名前= "bds.exeは" 名前、説明、PROCESSIDをGET

WMICプロセス、 THREADCOUNT、あなたがプロセスの情報を得ることができます。これにより

enter image description here

を処理します。

「プロセスに関連付けられたスレッドを取得する方法」の2番目の手順。これはWin32_Thread classで行うことができます。

あなたはこのようなクエリを起動した場合:ProcessHandle = 10740

WIN32_THREAD FROM

SELECT *をあなたは(最初のクエリのPROCESSIDを参照)、プロセス10740のすべてのスレッドを取得します。

よろしくお願いいたします。

+0

良い選択肢は、libが好きで、答えを受け入れることです。 – Mutha

+0

@Mutha - これは、SQLから明らかなすべてのスレッドの取得を避けるものではありません。ただ、ループしているWMIのコードではありません。 –

2

コードはすでに、まさにそれをやっているので、あなたはすでに、特定のプロセスのためのスレッドをフィルタリングする方法を知っている:

if TThreadEntry.th32OwnerProcessID = PID then 

が必要なのは、呼び出し元プロセスのためPIDです。その値を取得するにはGetCurrentProcessId()を使用してください。

TH32CS_SNAPTHREADを使用している場合、CreateToolhelp32Snapshot()ではスナップショットを特定のプロセスに制限できません。スナップショットにはシステム内のすべてのスレッドが含まれているため、ループしながらそれぞれのPIDでフィルタリングする必要があります。

+0

はループを防ぐことができませんでしたか? – Mutha

+0

ループは何の問題を引き起こしますか? –

+1

答えが説明するようにループを回避することはできません。 –

関連する問題