我想通过C / C ++计算当前Windows进程的本机线程。我看到有一个带有.NET答案的related question,但我无法使用该解决方案。我怀疑通过PdhOpenQuery / PdhCollectQueryData可能有一个解决方案,但我还没有探索过这个方向,我希望有一个更简单的方法。
更新:我应该说我当前的实现使用CreateToolhelp32Snapshot / Thread32First / Thread32Next,这就是我要替换的内容。该实现非常严重,在我的进程中每次调用都会导致20,000页错误。也许我只是错了用它?
Update2:最适合我的解决方案是使用我感兴趣的进程的PID创建一个类似“\ Process( _)\ Thread Count”的字符串。然后我调用PdhExpandWildCardPath()来扩展“”通配符。然后我调用了PdhOpenQuery(),PdhAddCounter()和PdhCollectQueryData()进行初始化。之后,我调用了PdhCollectQueryData()和PdhGetFormattedCounterValue()来定期获取我的值。
答案 0 :(得分:2)
编辑第二篇:您的文字说明了当前流程"。如果确实如此,您可以使用InterlockedDecrement
(DLL_THREAD_DETACH
}和InterlockedIncrement
(DLL_THREAD_ATTACH
上Interlocked*
来实现一个DllMain维护活动线程计数器的小型DLL。 })。
您必须确保您的进程尽早加载此DLL,因此主线程的线程计数从1开始。然后,您的线程计数始终是最新的,可通过printf
API快速访问。
编辑:为了提高性能,您可以访问进程的PerfMon计数器,并一次性获取给定进程的线程计数。你可以建模的VB代码here。
您也可以使用WMI按进程枚举线程,但这不是一个简单的编程模型。
PerfMon将是最快的。
ORIGINAL:
Raymond Chen对此here有准确的说明。只需要在#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;
}
之前的条件中按照您自己的处理ID(通过GetCurrentProcessId获得)进行过滤。
{{1}}
答案 1 :(得分:1)
ToolHelp API提供了一组枚举线程的函数。使用Thread32First
和Thread32Next
,您可以计算。