0

这里有一个类似的线程我尝试自己实现它。即尝试使用 c++ 库获取服务器中运行的线程数。

我可以确切地知道 COUNTER_PATH 是什么吗?(例如,给定链接中的“\Process(*_)\Thread Count” )?用那个和 pid 号创建一个字符串是什么意思?

以下是我到目前为止所写的内容,但没有真正理解任何内容:

#include <windows.h>
#include <pdh.h> //and suppose there're other libraries as necessary...

CONST PWSTR COUNTER_PATH = L"\Process(*)\Thread Count";

int returnNumThreads()
{
    HQUERY hQuery = NULL;
    HCOUNTER hCounter;
    DWORD counterType;
    PDH_FMT_COUNTERVALUE counterValue;
    PWSTR Paths = NULL;
    PDH_STATUS pdhStatus = PdhOpenQuery(NULL, 0, &hQuery);

    pdhStatus = PdhAddCounter(hQuery, COUNTER_PATH, 0, &hCounter);
    pdhStatus = PdhCollectQueryData(hQuery);
    pdhStatus = PdhGetFormattedCounterValue(hCounter,
                    PDH_FMT_LONG,
                    &counterType,
                    &counterValue);
    return counterValue.longValue;
}

// **Here, I removed all the error checking codes such as 
// "if (pdhStatus != ERROR_SUCCESS){...}" for better readability

**另外,上面链接中给出的解决方案是扩展通配符路径,但是当我检查PdhAddCounter 页面时,它说:“如果计数器路径包含通配符,所有匹配通配符的计数器名称都添加到查询”,所以我不确定是否真的需要扩展。

我一直在查看各种 示例,但我仍然不确定我是否正确地创建了查询或者仍然是 COUNTER_PATH 是什么。谁能给我一个解释?

4

1 回答 1

0

PdhAddCounter将命名计数器添加到打开的查询中。L"\Process(*)\Thread Count"是这样的名字。它被认为是“路径”名称,因为它的语法是分层的(部分由 分隔\),类似于文件路径。

通配符意味着您要为 、 等添加线程计数器Process(Foo)Process(Bar)获取所有进程的线程总数。(如果您正在运行 foo.exe 的两个副本,则第二个是\Process(Foo#1)

于 2012-05-18T09:10:03.367 回答