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

时间:2010-11-11 16:09:36

标签: c++ windows multithreading

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

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

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

2 个答案:

答案 0 :(得分:2)

编辑第二篇:您的文字说明了当前流程"。如果确实如此,您可以使用InterlockedDecrementDLL_THREAD_DETACH}和InterlockedIncrementDLL_THREAD_ATTACHInterlocked*来实现一个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提供了一组枚举线程的函数。使用Thread32FirstThread32Next,您可以计算。