如何在同一个进程中列出线程?

时间:2016-07-27 20:16:46

标签: windows multithreading delphi

我有这个代码贯穿所有线程。我想从我自己的进程中获取线程,而不必遍历系统上运行的所有线程。

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;

2 个答案:

答案 0 :(得分:2)

您已经知道如何过滤特定进程的线程,因为代码已经完全按照以下方式执行:

if TThreadEntry.th32OwnerProcessID = PID then

您需要的只是调用过程的PID。使用GetCurrentProcessId()获取该值。

不幸的是,CreateToolhelp32Snapshot()不允许您在使用TH32CS_SNAPTHREAD时将快照限制为特定进程,快照包含系统中的所有线程,因此您需要在各自的PID上过滤它们你循环通过它们。

答案 1 :(得分:0)

您可以使用WMI(Windows MIcrosoft Instrumentation)执行此操作。 Here there are an article解释了如何检索一个进程运行的所有线程。这篇文章是西班牙语,但你可以使用authomatic翻译o查看代码并下载样本。

使用WMI,您可以使用班级Win32_Process class获取流程的所有信息。 您可以尝试在控制台中执行这样的类似命令,以获取此类的信息。

  

WMIC流程,其中name =&#34; bds.exe&#34;获取名称,描述,ProcessId,   ThreadCount,Handle

enter image description here

通过这个,你可以获得过程的信息。

第二步如果&#34;如何检索与进程关联的线程&#34;。您可以使用Win32_Thread class

执行此操作

如果你启动这样的查询:

  

SELECT * FROM WIN32_THREAD WHERE ProcessHandle = 10740

您将获得进程10740的所有线程(请参阅第一个查询的ProcessId)。

问候。