Подсчет количества потоков на сервере Windows; встречный путь
Здесь была похожая тема, и я попытался реализовать это сам. т.е. пытаться получить количество потоков, запущенных на сервере, используя библиотеку 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. Кто-нибудь может дать мне объяснение?
1 ответ
PdhAddCounter
добавляет именованные счетчики в открытый запрос. L"\Process(*)\Thread Count"
такое имя Это имя называется "путь", поскольку его синтаксис является иерархическим (части, разделенные \
), аналогично путям к файлам.
Подстановочный знак означает, что вы хотите добавить счетчики потоков для Process(Foo)
, Process(Bar)
и т.д., чтобы получить общее количество потоков для всех процессов вместе. (Если вы используете две копии файла foo.exe, второй \Process(Foo#1)