gpt4 book ai didi

c++ - 如何以编程方式获取 Windows 进程的线程数?

转载 作者:可可西里 更新时间:2023-11-01 11:39:18 25 4
gpt4 key购买 nike

我想通过 C/C++ 计算当前 Windows 进程的 native 线程数。我看到有一个 related question有 .NET 答案,但我不能使用该解决方案。我怀疑可能有一个通过 PdhOpenQuery/PdhCollectQueryData 的解决方案,但我还没有探索那个方向,我希望有一个更简单的方法。

更新:我应该说我当前的实现使用 CreateToolhelp32Snapshot/Thread32First/Thread32Next,而这正是我要替换的。该实现非常笨拙,在我的进程中每次调用都会导致 20,000 个页面错误。也许我只是用错了?

Update2:最适合我的解决方案是使用我感兴趣的进程的 PID 创建一个类似“\Process(_)\Thread Count”的字符串。然后我调用 PdhExpandWildCardPath() 来扩展“”通配符。然后调用 PdhOpenQuery()、PdhAddCounter() 和 PdhCollectQueryData() 进行初始化。此后,我调用 PdhCollectQueryData() 和 PdhGetFormattedCounterValue() 定期获取我的值。

最佳答案

编辑第二个:你的文字说“当前进程”。如果确实如此,您可以实现一个小的 DLL,其 DllMain使用 InterlockedDecrement(在 DLL_THREAD_DETACH 上)和 InterlockedIncrement(在 DLL_THREAD_ATTACH 上)维护事件线程计数器。

您必须确保您的进程尽早加载此 DLL,以便我们的主线程的线程数从 1 开始。然后,您的线程计数将始终保持最新,并可通过 Interlocked* API 快速访问。

编辑:为了提高性能,您可以访问进程的 PerfMon 计数器,并一次获得给定进程的线程数。有VB代码here你可以模仿。

您也可以使用 WMI 按进程枚举线程,但这不是一个简单的编程模型。

PerfMon 将是最快的。

原创:Raymond Chen 对此有确切的说明 here .只需要在 printf 之前的条件中按匹配您自己的进程 ID(通过 GetCurrentProcessId 获得)进行过滤。

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>

int __cdecl main(int argc, char **argv)
{
HANDLE h = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (h != INVALID_HANDLE_VALUE) {
THREADENTRY32 te;
te.dwSize = sizeof(te);
if (Thread32First(h, &te)) {
do {
if (te.dwSize >= FIELD_OFFSET(THREADENTRY32, th32OwnerProcessID) +
sizeof(te.th32OwnerProcessID)) {
printf("Process 0x%04x Thread 0x%04x\n",
te.th32OwnerProcessID, te.th32ThreadID);
}
te.dwSize = sizeof(te);
} while (Thread32Next(h, &te));
}
CloseHandle(h);
}
return 0;
}

关于c++ - 如何以编程方式获取 Windows 进程的线程数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4156474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com