【问题标题】:How to list threads in the same process?如何列出同一进程中的线程?
【发布时间】:2016-07-27 20:16:46
【问题描述】:

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

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;

【问题讨论】:

标签: windows multithreading delphi


【解决方案1】:

您已经知道如何过滤特定进程的线程,因为代码已经在这样做了:

if TThreadEntry.th32OwnerProcessID = PID then

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

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

【讨论】:

  • 无法阻止循环?
  • 循环给你带来了什么问题?
  • 正如答案所解释的那样,您无法避免循环。
  • 循环不会给我带来任何麻烦,只是不想从我的上下文之外访问信息,我认为两者都不需要。所以我尝试了新的想法。
【解决方案2】:

您可以使用 WMI(Windows MIcrosoft Instrumentation)来做到这一点。 Here there are an article 解释了如何检索一个进程的所有正在运行的线程。文章为西班牙语,但您可以使用自动翻译查看代码和下载示例。

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

WMIC Process where name="bds.exe" GET Name, description, ProcessId, 线程数、句柄

通过它可以获取进程信息。

第二步如果“如何检索与进程关联的线程”。您可以使用Win32_Thread class 来执行此操作。

如果您启动这样的查询:

SELECT * FROM WIN32_THREAD WHERE ProcessHandle=10740

你得到进程 10740 的所有线程(参见第一个查询的 ProcessId)。

问候。

【讨论】:

  • 不错的选择,喜欢这个库,因此接受答案。
  • @Mutha - 这并不能避免从 sql 中检索所有线程。只是,循环的不是你的代码,而是 WMI。
  • 所提供的西班牙语文章链接到 404。这是指向 translated archived page on Wayback Machine的链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
  • 2020-09-01
  • 1970-01-01
相关资源
最近更新 更多