Здравствуйте ! Программисты , очень нужна Ваша помощь . Уже сил нету . Как работать с ключом HKEY_PERFORMANCE_DATA? Нужно определить значение основных счётчиков продуктивности . Уже перечитал всё , что можно и нельзя,но так и не разобрался .
прочитал , что список активных счётчиков лежит в HKLM\Software\Microsoft\Windows NT\Corrent Version\PerfLib
понял , что там изображены счётчики и их индексы
Я так понимаю, что для каждого счётчика нужно использовать свой индекс?
#include"stdafx.h"#include <windows.h>
#include <malloc.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#define TOTALBYTES 8192
#define BYTEINCREMENT 4096
const int Process_Index = 230;
const int PID_Process = 784;
void main()
{
DWORD BufferSize = TOTALBYTES; //размер буфера
DWORD cbData;
DWORD dwRet; //код возврата
PPERF_DATA_BLOCK PerfData = (PPERF_DATA_BLOCK) malloc( BufferSize );
PPERF_OBJECT_TYPE PerObjType;
PPERF_INSTANCE_DEFINITION PerDefin;
PPERF_COUNTER_BLOCK PerCount;
int i,k,j; //для циклов
string name;
cbData = BufferSize;
printf("\nRetrieving the data...");
dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
TEXT("Global"),
NULL,
NULL,
(LPBYTE) PerfData,
&cbData );
while( dwRet == ERROR_MORE_DATA )
{
// Get a buffer that is big enough.
BufferSize += BYTEINCREMENT;
PerfData = (PPERF_DATA_BLOCK) realloc( PerfData, BufferSize );
cbData = BufferSize;
printf(".");
dwRet = RegQueryValueEx( HKEY_PERFORMANCE_DATA,
TEXT("Global"),
NULL,
NULL,
(LPBYTE) PerfData,
&cbData );
}
if( dwRet == ERROR_SUCCESS )
{ printf("\n\nFinal buffer size is %d\n", BufferSize);
// cout<<PerfData<<" "<<endl;
}
else printf("\nRegQueryValueEx failed (%d)\n", dwRet);
RegCloseKey(HKEY_PERFORMANCE_DATA);
for (i=0;i<PerfData->NumObjectTypes;i++)
{
//ищем объект Process (индекс 230)if(PerObjType->ObjectNameTitleIndex=Process_Index)
{ //заполняем расположение описаний счётчиков PERE_COUNTER_DEFINITION
PerCount=/*....*/
}
// Получаем экземпляры объекта Process, если они естьif(PerObjType->NumInstances>0)
//получаем указатель на первую структуру PERF_INFINITION
PerDefin=/*...*/
}}
Как это всё обрабатывать то? ((
Как узнать , например , загрузку процессора или ещё что-нибудь?
Не знаю, что и делать ((
Помогите , пожалуйста , подтолкните в правильное русло
Здравствуйте, NNN7, Вы писали:
NNN>Здравствуйте ! Программисты , очень нужна Ваша помощь . Уже сил нету . Как работать с ключом HKEY_PERFORMANCE_DATA? Нужно определить значение основных счётчиков продуктивности . Уже перечитал всё , что можно и нельзя,но так и не разобрался . NNN>Как считать с этого ключа данные ? NNN>Помогите , пожалуйста , подтолкните в правильное русло
Все очень просто, открываете гугл, вбиваете "Using the Registry Functions to Consume Counter Data" в первой ссылке переходите на MSDN, в меню слева выбираете "Retrieving Counter Data" и смотрите пример от производителя.
Если хочется ещё проще, то открываете не первую ссылку в гугле, а вторую "Using the PDH Functions to Consume Counter Data" копипастите код пяти шагов к себе и получаете программу.
PS. Заодно рекомендуется ознакомится и с остальной частью Win32 & COM developer / Windows DevCenter — Desktop --> Diagnostics --> Perfomance Counters
Здравствуйте, 11molniev, Вы писали:
1>Здравствуйте, NNN7, Вы писали:
NNN>>Здравствуйте ! Программисты , очень нужна Ваша помощь . Уже сил нету . Как работать с ключом HKEY_PERFORMANCE_DATA? Нужно определить значение основных счётчиков продуктивности . Уже перечитал всё , что можно и нельзя,но так и не разобрался . NNN>>Как считать с этого ключа данные ? NNN>>Помогите , пожалуйста , подтолкните в правильное русло
1>Все очень просто, открываете гугл, вбиваете "Using the Registry Functions to Consume Counter Data" в первой ссылке переходите на MSDN, в меню слева выбираете "Retrieving Counter Data" и смотрите пример от производителя.
1>Если хочется ещё проще, то открываете не первую ссылку в гугле, а вторую "Using the PDH Functions to Consume Counter Data" копипастите код пяти шагов к себе и получаете программу.
1>PS. Заодно рекомендуется ознакомится и с остальной частью Win32 & COM developer / Windows DevCenter — Desktop --> Diagnostics --> Perfomance Counters
Спасибо за ответ . Я всё посмотрел , но всё равно не пойму , как правильно всё сделать . Мне нужно сохранить в отдельных переменных значения счётчиков , например , загрузку процессора , Memory ..
пример не выполняется , пишет :error LNK2019: unresolved external symbol "int __cdecl DisplayCalculatedValue(struct _rawdata *,struct _rawdata *)" (?DisplayCalculatedValue@@YAHPAU_rawdata@@0@Z) referenced in function _wmain 1>c:\users\samsung\documents\visual studio 2012\Projects\ConsoleApplication7\Debug\ConsoleApplication7.exe : fatal error LNK1120: 1 unresolved externals
и какой-то огромный код в примере
Потом посмотрел 2-ой пример:
#include"stdafx.h"#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <pdh.h>
#include <pdhmsg.h>
#pragma comment(lib, "pdh.lib")
CONST ULONG SAMPLE_INTERVAL_MS = 1000;
CONST PWSTR BROWSE_DIALOG_CAPTION = L"Select a counter to monitor.";
void wmain(void)
{
PDH_STATUS Status;
HQUERY Query = NULL;
HCOUNTER Counter;
PDH_FMT_COUNTERVALUE DisplayValue;
DWORD CounterType;
SYSTEMTIME SampleTime;
PDH_BROWSE_DLG_CONFIG BrowseDlgData;
WCHAR CounterPathBuffer[PDH_MAX_COUNTER_PATH];
//
// Create a query.
//
Status = PdhOpenQuery(NULL, NULL, &Query);
if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhOpenQuery failed with status 0x%x.", Status);
goto Cleanup;
}
//
// Initialize the browser dialog window settings.
//
ZeroMemory(&CounterPathBuffer, sizeof(CounterPathBuffer));
ZeroMemory(&BrowseDlgData, sizeof(PDH_BROWSE_DLG_CONFIG));
BrowseDlgData.bIncludeInstanceIndex = FALSE;
BrowseDlgData.bSingleCounterPerAdd = TRUE;
BrowseDlgData.bSingleCounterPerDialog = TRUE;
BrowseDlgData.bLocalCountersOnly = FALSE;
BrowseDlgData.bWildCardInstances = TRUE;
BrowseDlgData.bHideDetailBox = TRUE;
BrowseDlgData.bInitializePath = FALSE;
BrowseDlgData.bDisableMachineSelection = FALSE;
BrowseDlgData.bIncludeCostlyObjects = FALSE;
BrowseDlgData.bShowObjectBrowser = FALSE;
BrowseDlgData.hWndOwner = NULL;
BrowseDlgData.szReturnPathBuffer = CounterPathBuffer;
BrowseDlgData.cchReturnPathLength = PDH_MAX_COUNTER_PATH;
BrowseDlgData.pCallBack = NULL;
BrowseDlgData.dwCallBackArg = 0;
BrowseDlgData.CallBackStatus = ERROR_SUCCESS;
BrowseDlgData.dwDefaultDetailLevel = PERF_DETAIL_WIZARD;
BrowseDlgData.szDialogBoxCaption = BROWSE_DIALOG_CAPTION;
//
// Display the counter browser window. The dialog is configured
// to return a single selection from the counter list.
//
Status = PdhBrowseCounters(&BrowseDlgData);
if (Status != ERROR_SUCCESS)
{
if (Status == PDH_DIALOG_CANCELLED)
{
wprintf(L"\nDialog canceled by user.");
}
else
{
wprintf(L"\nPdhBrowseCounters failed with status 0x%x.", Status);
}
goto Cleanup;
}
else if (wcslen(CounterPathBuffer) == 0)
{
wprintf(L"\nUser did not select any counter.");
goto Cleanup;
}
else
{
wprintf(L"\nCounter selected: %s\n", CounterPathBuffer);
}
//
// Add the selected counter to the query.
//
Status = PdhAddCounter(Query, CounterPathBuffer, 0, &Counter);
if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhAddCounter failed with status 0x%x.", Status);
goto Cleanup;
}
//
// Most counters require two sample values to display a formatted value.
// PDH stores the current sample value and the previously collected
// sample value. This call retrieves the first value that will be used
// by PdhGetFormattedCounterValue in the first iteration of the loop
// Note that this value is lost if the counter does not require two
// values to compute a displayable value.
//
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhCollectQueryData failed with 0x%x.\n", Status);
goto Cleanup;
}
//
// Print counter values until a key is pressed.
//while (!_kbhit())
{
Sleep(SAMPLE_INTERVAL_MS);
GetLocalTime(&SampleTime);
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhCollectQueryData failed with status 0x%x.", Status);
}
wprintf(L"\n\"%2.2d/%2.2d/%4.4d %2.2d:%2.2d:%2.2d.%3.3d\"",
SampleTime.wMonth,
SampleTime.wDay,
SampleTime.wYear,
SampleTime.wHour,
SampleTime.wMinute,
SampleTime.wSecond,
SampleTime.wMilliseconds);
//
// Compute a displayable value for the counter.
//
Status = PdhGetFormattedCounterValue(Counter,
PDH_FMT_DOUBLE,
&CounterType,
&DisplayValue);
if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhGetFormattedCounterValue failed with status 0x%x.", Status);
goto Cleanup;
}
wprintf(L",\"%.20g\"", DisplayValue.doubleValue);
}
Cleanup:
//
// Close the query.
//if (Query)
{
PdhCloseQuery(Query);
}
}
Он вроде работает .
Но мне нужно сделать так , чтобы в программе уже определялось , какие счётчики считывать ( например : загрузка ЦП, Memory) . Как это можно сделать ?
Чтобы не появлялось окно с выбором счётчиков?
Здравствуйте, NNN7, Вы писали:
NNN>Спасибо за ответ . Я всё посмотрел , но всё равно не пойму , как правильно всё сделать . Мне нужно сохранить в отдельных переменных значения счётчиков , например , загрузку процессора , Memory ..
NNN>Вот посмотрел эту ссылку http://msdn.microsoft.com/en-us/library/windows/desktop/aa373178(v=vs.85).aspx
NNN>пример не выполняется , пишет :error LNK2019: unresolved external symbol "int __cdecl DisplayCalculatedValue(struct _rawdata *,struct _rawdata *)" (?DisplayCalculatedValue@@YAHPAU_rawdata@@0@Z) referenced in function _wmain 1>>c:\users\samsung\documents\visual studio 2012\Projects\ConsoleApplication7\Debug\ConsoleApplication7.exe : fatal error LNK1120: 1 unresolved externals
Если вы вспомните язык Си и внимательно посмотрите на эту функцию или посмотрите в msdn/интернет-е код ошибки LNK2019 то обнаружите, что ошибка связана с тем, что прототип функции объявлен, использован, но нет его реализации.
Вы должны сами написать эту функцию и определить, что ей делать с получаемыми данными.
NNN>Потом посмотрел 2-ой пример: NNN>Он вроде работает . NNN>Но мне нужно сделать так , чтобы в программе уже определялось , какие счётчики считывать ( например : загрузка ЦП, Memory) . Как это можно сделать ? NNN>Чтобы не появлялось окно с выбором счётчиков?
Этот пример избыточен, он добавляет один выбранный пользователем счетчик — вы можете не предоставлять пользователю выбора, а тупо вбить путь к счетчику как константу в PdhAddCounter, типа:
PdhAddCounterW(hQuery, L"\\Processor(0)\\% Processor Time", 0, &hCounter);
Но нужно помнить, что на разных системах (локализациях) пути будут отличаться. Чтоб не выводила запроса — уберите лишние вызовы. Вызовов PdhAddCounter, на один запрос может быть множество — ассоциируйте все желаемые параметры и в цикле (разумеется с паузой) получайте их значения.
NNN>Пожалуйста , помогите
Прочтите в MSDN описание всех функций из примера №2.
Здравствуйте, 11molniev, Вы писали:
1>Здравствуйте, NNN7, Вы писали:
NNN>>Спасибо за ответ . Я всё посмотрел , но всё равно не пойму , как правильно всё сделать . Мне нужно сохранить в отдельных переменных значения счётчиков , например , загрузку процессора , Memory ..
NNN>>Вот посмотрел эту ссылку http://msdn.microsoft.com/en-us/library/windows/desktop/aa373178(v=vs.85).aspx
NNN>>пример не выполняется , пишет :error LNK2019: unresolved external symbol "int __cdecl DisplayCalculatedValue(struct _rawdata *,struct _rawdata *)" (?DisplayCalculatedValue@@YAHPAU_rawdata@@0@Z) referenced in function _wmain 1>>>c:\users\samsung\documents\visual studio 2012\Projects\ConsoleApplication7\Debug\ConsoleApplication7.exe : fatal error LNK1120: 1 unresolved externals
1>Если вы вспомните язык Си и внимательно посмотрите на эту функцию или посмотрите в msdn/интернет-е код ошибки LNK2019 то обнаружите, что ошибка связана с тем, что прототип функции объявлен, использован, но нет его реализации. 1>Вы должны сами написать эту функцию и определить, что ей делать с получаемыми данными.
NNN>>Потом посмотрел 2-ой пример: NNN>>Он вроде работает . NNN>>Но мне нужно сделать так , чтобы в программе уже определялось , какие счётчики считывать ( например : загрузка ЦП, Memory) . Как это можно сделать ? NNN>>Чтобы не появлялось окно с выбором счётчиков? 1>Этот пример избыточен, он добавляет один выбранный пользователем счетчик — вы можете не предоставлять пользователю выбора, а тупо вбить путь к счетчику как константу в PdhAddCounter, типа: 1>PdhAddCounterW(hQuery, L"\\Processor(0)\\% Processor Time", 0, &hCounter); 1>Но нужно помнить, что на разных системах (локализациях) пути будут отличаться. Чтоб не выводила запроса — уберите лишние вызовы. Вызовов PdhAddCounter, на один запрос может быть множество — ассоциируйте все желаемые параметры и в цикле (разумеется с паузой) получайте их значения.
NNN>>Пожалуйста , помогите 1>Прочтите в MSDN описание всех функций из примера №2.
Спасибо за ответ . Возник вопрос : а как правильно получить путь к счётчику? если смотреть в реестре , то описание счётчиков(имя и индекс) лежит в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009 , но не писать же этот путь?
Здравствуйте, NNN7, Вы писали:
NNN>Спасибо за ответ . Возник вопрос : а как правильно получить путь к счётчику? если смотреть в реестре , то описание счётчиков(имя и индекс) лежит в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009 , но не писать же этот путь?
Я точно не помню. Тема поднималась здесь на этом форуме, и там проскальзывали разные решения, но вспомнить тяжело.
Если говорить об одной системе (в смысле язык, версия, установленное по) — то путь который дает PdhEnumObjects/диалог выбора счетчика/системный монитор — будет универсален. (устанавливаемое по может расширять число счетчиков).
Если не ошибаюсь, то базовые счетчики (память, процессор — то что вас интересует) будут иметь один и тот же путь во всех версиях — но лучше поставьте на виртуалке английскую xp к примеру и посмотрите.
Здравствуйте, 11molniev, Вы писали:
1>Здравствуйте, NNN7, Вы писали:
NNN>>Спасибо за ответ . Возник вопрос : а как правильно получить путь к счётчику? если смотреть в реестре , то описание счётчиков(имя и индекс) лежит в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009 , но не писать же этот путь?
1> Я точно не помню. Тема поднималась здесь на этом форуме, и там проскальзывали разные решения, но вспомнить тяжело.
1>Если говорить об одной системе (в смысле язык, версия, установленное по) — то путь который дает PdhEnumObjects/диалог выбора счетчика/системный монитор — будет универсален. (устанавливаемое по может расширять число счетчиков). 1>Если не ошибаюсь, то базовые счетчики (память, процессор — то что вас интересует) будут иметь один и тот же путь во всех версиях — но лучше поставьте на виртуалке английскую xp к примеру и посмотрите.
ну у меня сейчас стоит Windows , 64 разрядная
то есть , нельзя записать путь как HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009\Memory?
Здравствуйте, 11molniev, Вы писали:
1>Здравствуйте, NNN7, Вы писали:
NNN>>Спасибо за ответ . Возник вопрос : а как правильно получить путь к счётчику? если смотреть в реестре , то описание счётчиков(имя и индекс) лежит в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009 , но не писать же этот путь?
1> Я точно не помню. Тема поднималась здесь на этом форуме, и там проскальзывали разные решения, но вспомнить тяжело.
1>Если говорить об одной системе (в смысле язык, версия, установленное по) — то путь который дает PdhEnumObjects/диалог выбора счетчика/системный монитор — будет универсален. (устанавливаемое по может расширять число счетчиков). 1>Если не ошибаюсь, то базовые счетчики (память, процессор — то что вас интересует) будут иметь один и тот же путь во всех версиях — но лучше поставьте на виртуалке английскую xp к примеру и посмотрите.
Вот , попробовал сделать что-то , вроде всё просто , но не работает , везде faild выбивает :
#include"stdafx.h"#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <pdh.h>
#include <pdhmsg.h>
#include <iostream>
#pragma comment(lib, "pdh.lib")
CONST ULONG SAMPLE_INTERVAL_MS = 1000;
CONST PWSTR BROWSE_DIALOG_CAPTION = L"Select a counter to monitor.";
void wmain(void)
{
PDH_STATUS Status;
HQUERY Query = NULL;
HCOUNTER Counter;
DWORD CounterType;
SYSTEMTIME SampleTime;
PDH_FMT_COUNTERVALUE DisplayValue;
//Создаём запрос
Status = PdhOpenQuery(NULL, NULL, &Query); //запрос на использование счётчиков производительностиif (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhOpenQuery failed with status 0x%x.", Status);
}
/*Добавить счётчик в запрос*/
Status = PdhAddCounter(Query, (LPCTSTR)"\\Processor(0)\\% Processor Time", 0, &Counter);
if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhAddCounter failed with status 0x%x.", Status);
}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhCollectQueryData failed with 0x%x.\n", Status);
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status = PdhGetFormattedCounterValue(Counter,
PDH_FMT_DOUBLE,
&CounterType,
&DisplayValue);
if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhGetFormattedCounterValue failed with status 0x%x.", Status);
}
wprintf(L"\"%.20g\"", DisplayValue.doubleValue);
//Cleanup:
//
// Close the query.
//if (Query)
{
PdhCloseQuery(Query);
}
}
Первая функция создания запроса работает . А вот во второй (и в следствии дальше во всех остальных) выдаёт ошибку
/*Добавить счётчик в запрос*/
Status = PdhAddCounter(Query, (LPCTSTR)"\\Processor(0)\\% Processor Time", 0, &Counter);
if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhAddCounter failed with status 0x%x.", Status);
}
Здравствуйте, NNN7, Вы писали:
1>>Если говорить об одной системе (в смысле язык, версия, установленное по) — то путь который дает PdhEnumObjects/диалог выбора счетчика/системный монитор — будет универсален. (устанавливаемое по может расширять число счетчиков). 1>>Если не ошибаюсь, то базовые счетчики (память, процессор — то что вас интересует) будут иметь один и тот же путь во всех версиях — но лучше поставьте на виртуалке английскую xp к примеру и посмотрите.
NNN>Вот , попробовал сделать что-то , вроде всё просто , но не работает , везде faild выбивает :
NNN>
NNN> /*Добавить счётчик в запрос*/
NNN> Status = PdhAddCounter(Query, (LPCTSTR)"\\Processor(0)\\% Processor Time", 0, &Counter);
NNN> if (Status != ERROR_SUCCESS)
NNN> {
NNN> wprintf(L"\nPdhAddCounter failed with status 0x%x.", Status);
NNN> }
NNN>
1. Надо запоминать, что делаете или делегировать это системе контроля версий
2. (LPCTSTR) не надо писать. Тем более это скорей всего ошибка, либо делайте так:
PdhAddCounterA(Query, "\\Processor(0)\\% Processor Time", 0, &Counter);
либо так:
PdhAddCounterW(Query, L"\\Processor(0)\\% Processor Time", 0, &Counter);
второй вариант предпочтительней
3. Не надо задавать вопросы "везде faild" и потому что "failed" и потому что есть GetLastError/FormatMessage которые описывают причину ошибки и код ошибки которая возвращает функция не ERROR_SUCCESS.
4. А счетчик "\\Processor(0)\\% Processor Time" у вас в русскоязычной системе есть? На русскоязычной восьмерке он будет называться L"\\Сведения о процессоре(Total)\\% загруженности процессора".
1>1. Надо запоминать, что делаете или делегировать это системе контроля версий 1>2. (LPCTSTR) не надо писать. Тем более это скорей всего ошибка, либо делайте так: 1>PdhAddCounterA(Query, "\\Processor(0)\\% Processor Time", 0, &Counter); 1>либо так: 1>PdhAddCounterW(Query, L"\\Processor(0)\\% Processor Time", 0, &Counter); 1>второй вариант предпочтительней 1>3. Не надо задавать вопросы "везде faild" и потому что "failed" и потому что есть GetLastError/FormatMessage которые описывают причину ошибки и код ошибки которая возвращает функция не ERROR_SUCCESS. 1>4. А счетчик "\\Processor(0)\\% Processor Time" у вас в русскоязычной системе есть? На русскоязычной восьмерке он будет называться L"\\Сведения о процессоре(Total)\\% загруженности процессора".
Исправил , как Вы сказали :
/*Добавить счётчик в запрос*/
Status = PdhAddCounterA(Query, "\\Сведения о процессоре(Total)\\% загруженности процессора", 0, &Counter); //PdhAddCounter(Query,"\\Процессор(_Total)\\% загруженности процессора", 0, &Counter);if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhAddCounter failed with status 0x%x.", Status);
}
else
{ std::cout<<std::endl;
wprintf(L"\nAddCounter - OK");
}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
wprintf(L"\nPdhCollectQueryData failed with 0x%x.\n", Status);
int error =0;
error=GetLastError();
std::cout<<"error="<<error<<std::endl;
}
else
{ std::cout<<std::endl;
wprintf(L"\CollectQueryData -OK\n");
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status = PdhGetFormattedCounterValue(Counter,
PDH_FMT_DOUBLE,
&CounterType,
&DisplayValue);
if (Status != ERROR_SUCCESS)
{
// wprintf(L"\nPdhGetFormattedCounterValue failed with status 0x%x.", Status);int error =GetLastError();
std::cout<<"error="<<error;
}
else
{ std::cout<<std::endl;
wprintf(L"\ Formatted -OK\n");
}
wprintf(L",\"%.20g\"", DisplayValue.doubleValue);
//Cleanup:
//
// Close the query.
//if (Query)
{
PdhCloseQuery(Query);
}
}
Не работает . GetLastError () возвращает непонятные вообще ошибки
Здравствуйте, Pavel Dvorkin.
Спасибо , с этим примером я разобрался , почитал , что к чему . Убрал интерфейс , попробовал в консоли всё это сделать для некоторых счётчиков — всё получилось .
Мне теперь нужно в графическом виде это представить , а именно записать значение счётчика (какого-либо ) в ListBox . Всё считает , все функции работают , но не могу разобраться , как конвертировать результат в строку — для вывода .
Вот мой код:
#include <Windows.h>
#include"resource.h"#include <string.h>
#include <pdh.h>
#include <pdhmsg.h>
#include <iostream>
#include <stdio.h>
using namespace std;
#pragma comment(lib, "pdh.lib")
#define COMBOBOX 1
#define LISTBOX 2
HWND CB,LB;
BOOL WINAPI WndProc (HWND ,UINT ,WPARAM ,LPARAM );
//главня функция int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,LPSTR CmdLine,int CmdShow)
{
//создание диалогового окна главным окном int db;
db=DialogBox (hInst,MAKEINTRESOURCE(IDD_DIALOG1),GetDesktopWindow(),WndProc);
}
BOOL WINAPI WndProc (HWND hwnd,UINT uMsg,WPARAM wpar,LPARAM lpar )
{
wchar_t str [51]; //буфер
PDH_STATUS Status;
HQUERY Query = NULL;
HCOUNTER Counter;
DWORD CounterType;
SYSTEMTIME SampleTime;
PDH_FMT_COUNTERVALUE DisplayValue;
char buf [50];
switch (uMsg)
{
case WM_COMMAND:
//Если нажата кнопка Quit, тозакрываем окноif (LOWORD(wpar)==QUIT)
{EndDialog(hwnd,NULL);
return TRUE;
}
break;
case WM_INITDIALOG:
//Создаём список лет:
CB=CreateWindow((LPCSTR)"Combobox",(LPCSTR)"Combo1", CBS_DROPDOWNLIST|WS_CHILD|WS_VISIBLE/*|WS_VSCROLL|CBS_DROPDOWNLIST*/,
90,360,200,300, hwnd, (HMENU)COMBOBOX,0, NULL);
//Заносим значения лет:
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% Use time");
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% Processor time");
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% Privileged Time");
//Создаём запрос
Status = PdhOpenQueryW(NULL, 0, &Query); //запрос на использование счётчиков производительностиif(Status==ERROR_SUCCESS)
{MessageBox(hwnd,(LPSTR)"open-OK",(LPCSTR)"",MB_OK);}
/*Добавить счётчик в запрос*/
Status = PdhAddEnglishCounterW(Query, L"\\Processor(_Total)\\% Privileged Time", 0, &Counter);
if (Status == ERROR_SUCCESS)
{MessageBox(hwnd,(LPSTR)"add-OK",(LPCSTR)"",MB_OK);}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status = PdhCollectQueryData(Query);
if (Status == ERROR_SUCCESS)
{MessageBox(hwnd,(LPSTR)"collect-OK",(LPCSTR)"",MB_OK);
}
Sleep(1000);
Status = PdhCollectQueryData(Query);
if (Status == ERROR_SUCCESS)
{MessageBox(hwnd,(LPSTR)"collect-OK",(LPCSTR)"",MB_OK);
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status = PdhGetFormattedCounterValue(Counter,
PDH_FMT_DOUBLE,
&CounterType,
&DisplayValue);
if(Status==ERROR_SUCCESS)
{MessageBox(hwnd,(LPSTR)"formatted-OK",(LPCSTR)"",MB_OK);
}
//вывод результата:
LB=CreateWindow("Listbox", NULL,
WS_VISIBLE|WS_CHILD| WS_VSCROLL | WS_TABSTOP |WS_BORDER ,
90,140,300,200, hwnd, (HMENU)LISTBOX, 0, NULL);
wsprintf(buf, "%f", DisplayValue);
SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf);
if (Query)
{
PdhCloseQuery(Query);
}
}
return 0;
}
Здравствуйте, Pavel Dvorkin. С преобразованием я уже разобрался , вроде получилось :
#include <Windows.h>
#include"resource.h"#include <string.h>
#include <pdh.h>
#include <pdhmsg.h>
#include <iostream>
#include <stdio.h>
using namespace std;
#pragma comment(lib, "pdh.lib")
#define COMBOBOX 1
#define LISTBOX 2
HWND CB,LB;
wchar_t str [51]; //буфер
TCHAR buf[20] = {0}; //для вывода
TCHAR buf2 [20] ={0};
PDH_STATUS Status;
PDH_STATUS Status2;
HQUERY Query2=NULL;
HQUERY Query = NULL;
HCOUNTER Counter;
DWORD CounterType;
PDH_FMT_COUNTERVALUE DisplayValue;
HCOUNTER Counter2;
DWORD CounterType2;
PDH_FMT_COUNTERVALUE DisplayValue2;
BOOL WINAPI WndProc (HWND ,UINT ,WPARAM ,LPARAM );
//главня функция int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,LPSTR CmdLine,int CmdShow)
{
//создание диалогового окна главным окном int db;
db=DialogBox (hInst,MAKEINTRESOURCE(IDD_DIALOG1),GetDesktopWindow(),WndProc);
}
BOOL WINAPI WndProc (HWND hwnd,UINT uMsg,WPARAM wpar,LPARAM lpar )
{
switch (uMsg)
{
case WM_COMMAND:
//Если нажата кнопка Quit, тозакрываем окноif (LOWORD(wpar)==QUIT)
{ EndDialog(hwnd,NULL);
return TRUE;
}
if(LOWORD(wpar)==SELECT)
{
GetDlgItemText(hwnd,COMBOBOX,(LPSTR)str,51);
if(lstrcmp((LPCSTR)str,"% Privileged Time") == 0)
{ sprintf_s(buf, TEXT("%lf"), DisplayValue.doubleValue);
SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf);
}
if(lstrcmp((LPCSTR)str,"% User time") == 0)
{
sprintf_s(buf2, TEXT("%lf"), DisplayValue2.doubleValue);
SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf2);
}
}
break;
case WM_INITDIALOG:
//Создаём список счётчиков производительности
CB=CreateWindow((LPCSTR)"Combobox",(LPCSTR)"Combo1", CBS_DROPDOWNLIST|WS_CHILD|WS_VISIBLE,90,360,200,300, hwnd, (HMENU)COMBOBOX,0, NULL);
//Заносим возможные варианты счётчиков
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% User time");
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% Processor time");
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% Privileged Time");
//Создаём список для вывода значения счётчиков
LB=CreateWindow("Listbox", NULL,WS_VISIBLE|WS_CHILD| WS_VSCROLL | WS_TABSTOP |WS_BORDER , 90,140,300,200, hwnd, (HMENU)LISTBOX, 0, NULL);
//Создать запрос
Status = PdhOpenQueryW(NULL, 0, &Query);
if(Status!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
}
//Добавить счётчик в запрос
Status = PdhAddEnglishCounterW(Query, L"\\Processor(_Total)\\% Privileged Time", 0, &Counter);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK);
}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
}
Sleep(1000);
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status = PdhGetFormattedCounterValue(Counter,PDH_FMT_DOUBLE,&CounterType,&DisplayValue);
if(Status!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"formatted-NOT OK",(LPCSTR)"",MB_OK);
}
/*закрываем запрос*/if (Query){PdhCloseQuery(Query);}
//НОВЫЙ ЗАПРОС!!!
Status2 = PdhOpenQueryW(NULL, 0, &Query2);
if(Status2!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
}
//Добавить счётчик в запрос
Status2 = PdhAddEnglishCounterW(Query2, L"\\Processor(_Total)\\% User Time", 0, &Counter2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK);
}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status2 = PdhCollectQueryData(Query2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
}
Sleep(1000);
Status2 = PdhCollectQueryData(Query2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status2 = PdhGetFormattedCounterValue(Counter2,PDH_FMT_DOUBLE,&CounterType2,&DisplayValue2);
if(Status2!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"formatted-NOT OK",(LPCSTR)"",MB_OK);
}
/*закрываем запрос*/if (Query2){PdhCloseQuery(Query2);}
}
return 0;
}
Возник такой вопрос : а как сделать , чтобы выводимые значения обновлялись как-то ? сами или по нажатию кнопки .. Думаю,думаю..никак не могу сообразить .
Эх, ещё бы с функциями реестра как-то разобраться..
Здравствуйте, NNN7, Вы писали:
NNN> case WM_INITDIALOG: NNN> //Создаём список счётчиков производительности NNN> CB=CreateWindow((LPCSTR)"Combobox",(LPCSTR)"Combo1", CBS_DROPDOWNLIST|WS_CHILD|WS_VISIBLE,90,360,200,300, hwnd, (HMENU)COMBOBOX,0, NULL);
Не стоит так делать. Просто в редакторе ресурсов брось на панель диалога комбобокс, взяв его с панели инструментов. Для получения его хендла — GetDlgItem
NNN> //Создаём список для вывода значения счётчиков NNN> LB=CreateWindow("Listbox", NULL,WS_VISIBLE|WS_CHILD| WS_VSCROLL | WS_TABSTOP |WS_BORDER , 90,140,300,200, hwnd, (HMENU)LISTBOX, 0, NULL);
То же самое.
NNN> if(Status!=ERROR_SUCCESS) NNN> { NNN> MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
Хорошо, но надо в этом случае выйти и закрыть диалог, а сейчас идет все дальше...
NNN> if (Status != ERROR_SUCCESS) NNN> { NNN> MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK); NNN> }
То же. И далее то же.
NNN>Возник такой вопрос : а как сделать , чтобы выводимые значения обновлялись как-то ? сами или по нажатию кнопки .. Думаю,думаю..никак не могу сообразить .
По таймеру. Заведи таймер (SetTimer) на WM_INITDIALOG, по WM_TIMER делай все, что делаешь (вынеси в отдельную функцию) и перезаливай в контролы. Не забудь при закрытии диалога его убить (KillTimer).
NNN>Эх, ещё бы с функциями реестра как-то разобраться..
Не надо, Pdh проще и понятнее. Он специально для этого разработан.
With best regards
Pavel Dvorkin
Re[4]: Непонятный ключ HKEY_PERFORMANCE_DATA
От:
Аноним
Дата:
06.05.14 19:17
Оценка:
Здравствуйте, Pavel Dvorkin. Снова спасибо Вам за ответ .Ошибки попытался исправить.
Честно — никогда не делал ничего с таймером ( новичок совсем). Почитал о всём этом . Сделал так:
#include <Windows.h>
#include"resource.h"#include <string.h>
#include <pdh.h>
#include <pdhmsg.h>
#include <iostream>
#include <stdio.h>
using namespace std;
#pragma comment(lib, "pdh.lib")
HWND CB,LB;
wchar_t str [51]; //буфер
TCHAR buf[20] = {0}; //для вывода
TCHAR buf2 [20] ={0};
PDH_STATUS Status;
PDH_STATUS Status2;
HQUERY Query2=NULL;
HQUERY Query = NULL;
HCOUNTER Counter;
DWORD CounterType;
PDH_FMT_COUNTERVALUE DisplayValue;
HCOUNTER Counter2;
DWORD CounterType2;
PDH_FMT_COUNTERVALUE DisplayValue2;
BOOL WINAPI WndProc (HWND ,UINT ,WPARAM ,LPARAM );
//главня функция int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,LPSTR CmdLine,int CmdShow)
{
//создание диалогового окна главным окном int db;
db=DialogBox (hInst,MAKEINTRESOURCE(IDD_DIALOG1),GetDesktopWindow(),WndProc);
}
BOOL WINAPI WndProc (HWND hwnd,UINT uMsg,WPARAM wpar,LPARAM lpar )
{
switch (uMsg)
{
case WM_COMMAND:
//Если нажата кнопка Quit, тозакрываем окноif (LOWORD(wpar)==QUIT)
{ EndDialog(hwnd,NULL);
return TRUE;
}
if(LOWORD(wpar)==SELECT)
{
GetDlgItemText(hwnd,COMBO,(LPSTR)str,51);
if(lstrcmp((LPCSTR)str,"% Privileged Time") == 0)
{ sprintf_s(buf, TEXT("%lf"), DisplayValue.doubleValue);
SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf);
}
if(lstrcmp((LPCSTR)str,"% User time") == 0)
{
sprintf_s(buf2, TEXT("%lf"), DisplayValue2.doubleValue);
SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf2);
}
}
break;
case WM_TIMER:
//проделываем :if(LOWORD(wpar)==SELECT)
{
GetDlgItemText(hwnd,COMBO,(LPSTR)str,51);
if(lstrcmp((LPCSTR)str,"% Privileged Time") == 0)
{ sprintf_s(buf, TEXT("%lf"), DisplayValue.doubleValue);
SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf);
}
if(lstrcmp((LPCSTR)str,"% User time") == 0)
{
sprintf_s(buf2, TEXT("%lf"), DisplayValue2.doubleValue);
SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf2);
}
}
break;
case WM_INITDIALOG:
/*Создание таймера!*/
SetTimer(hwnd,1,3000,NULL); //таймер на каждые 3 секунды
//Создаём список счётчиков производительности
CB=GetDlgItem(hwnd,COMBO);
//Заносим возможные варианты счётчиков
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% User time");
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% Processor time");
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% Privileged Time");
//Создаём список для вывода значения счётчиков
LB=GetDlgItem(hwnd,LIST);
//Создать запрос
Status = PdhOpenQueryW(NULL, 0, &Query);
if(Status!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
//Добавить счётчик в запрос
Status = PdhAddEnglishCounterW(Query, L"\\Processor(_Total)\\% Privileged Time", 0, &Counter);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
Sleep(1000);
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status = PdhGetFormattedCounterValue(Counter,PDH_FMT_DOUBLE,&CounterType,&DisplayValue);
if(Status!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"formatted-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*закрываем запрос*/if (Query){PdhCloseQuery(Query);}
//НОВЫЙ ЗАПРОС!!!
Status2 = PdhOpenQueryW(NULL, 0, &Query2);
if(Status2!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
//Добавить счётчик в запрос
Status2 = PdhAddEnglishCounterW(Query2, L"\\Processor(_Total)\\% User Time", 0, &Counter2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status2 = PdhCollectQueryData(Query2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
Sleep(1000);
Status2 = PdhCollectQueryData(Query2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status2 = PdhGetFormattedCounterValue(Counter2,PDH_FMT_DOUBLE,&CounterType2,&DisplayValue2);
if(Status2!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"formatted-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*закрываем запрос*/if (Query2){PdhCloseQuery(Query2);}
}
return 0;
}
Установил SetTimer(), а в WM_TIME проделывал действия . При выходе — убиваем таймер .
Но что-то оно не то . Не понял на счёт контролов (что это и зачем ?) Пожалуйста , можете объяснить , что к чему?
На счёт функций реестра.. — нужны они мне всё равно ( знаю, что глупо их использовать), задают такое , сам не рад
Сейчас буду читать и о них, попытаюсь хоть немного разобраться
Re[2]: Непонятный ключ HKEY_PERFORMANCE_DATA
От:
Аноним
Дата:
06.05.14 19:33
Оценка:
Здравствуйте, Pavel Dvorkin. + ещё забыл дописать уничтожение таймера:
Не то проделываем. Здесь надо вызвать функцию (отдельную), которая делает то, что сейчас делается на WM_INITDIALOG. Иными словам ,вытащить код из WM_INITDIALOG, оформить как отдельную функцию и здесь вызывать. Она должна, во-первых, очищать листбокс и комбобокс, потом делать все Pdh — запросы, получать тем самым новые DispalyValue и DispalyValue2, а дальше, как у тебя. Тогда они будут по таймеру меняться, ну и отображаться.
Здравствуйте, Pavel Dvorkin. Спасибо за ответ . Всё равно не получается никак
Создал функцию func() , в которой очищаю листбокс и комбобокс , а дальше просто вставил текст с WM_INITDIALOG. А в WM_TIMER вызвал эту функцию . Но неправильно сделал , не пойму , почему . Можете , пожалуйста , помочь , как это правильно сделать ? Вот код мой :
#include <Windows.h>
#include"resource.h"#include <string.h>
#include <pdh.h>
#include <pdhmsg.h>
#include <iostream>
#include <stdio.h>
using namespace std;
#pragma comment(lib, "pdh.lib")
HWND CB,LB;
int func(HWND hwnd);
wchar_t str [51]; //буфер
TCHAR buf[20] = {0}; //для вывода
TCHAR buf2 [20] ={0};
PDH_STATUS Status;
PDH_STATUS Status2;
HQUERY Query2=NULL;
HQUERY Query = NULL;
HCOUNTER Counter;
DWORD CounterType;
PDH_FMT_COUNTERVALUE DisplayValue;
HCOUNTER Counter2;
DWORD CounterType2;
PDH_FMT_COUNTERVALUE DisplayValue2;
BOOL WINAPI WndProc (HWND ,UINT ,WPARAM ,LPARAM );
//главня функция int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst,LPSTR CmdLine,int CmdShow)
{
//создание диалогового окна главным окном int db;
db=DialogBox (hInst,MAKEINTRESOURCE(IDD_DIALOG1),GetDesktopWindow(),WndProc);
}
BOOL WINAPI WndProc (HWND hwnd,UINT uMsg,WPARAM wpar,LPARAM lpar )
{
switch (uMsg)
{
case WM_COMMAND:
//Если нажата кнопка Quit, тозакрываем окноif (LOWORD(wpar)==QUIT)
{ EndDialog(hwnd,NULL);
KillTimer(hwnd,1);
return TRUE;
}
if(LOWORD(wpar)==SELECT)
{
GetDlgItemText(hwnd,COMBO,(LPSTR)str,51);
if(lstrcmp((LPCSTR)str,"% Privileged Time") == 0)
{ sprintf_s(buf, TEXT("%lf"), DisplayValue.doubleValue);
SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf);
}
if(lstrcmp((LPCSTR)str,"% User time") == 0)
{
sprintf_s(buf2, TEXT("%lf"), DisplayValue2.doubleValue);
SendMessage(LB, LB_ADDSTRING, 1, ( LPARAM)buf2);
}
}
break;
case WM_TIMER:
func(hwnd);
case WM_INITDIALOG:
//установка таймера
SetTimer(hwnd,1,3000,NULL);
//Создаём список счётчиков производительности
CB=GetDlgItem(hwnd,COMBO);
//Заносим возможные варианты счётчиков
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% User time");
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% Processor time");
SendMessage(CB, CB_ADDSTRING, 0, (LPARAM)"% Privileged Time");
//Создаём список для вывода значения счётчиков
LB=GetDlgItem(hwnd,LIST);
//Создать запрос
Status = PdhOpenQueryW(NULL, 0, &Query);
if(Status!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
//Добавить счётчик в запрос
Status = PdhAddEnglishCounterW(Query, L"\\Processor(_Total)\\% Privileged Time", 0, &Counter);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
Sleep(1000);
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status = PdhGetFormattedCounterValue(Counter,PDH_FMT_DOUBLE,&CounterType,&DisplayValue);
if(Status!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"formatted-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*закрываем запрос*/if (Query){PdhCloseQuery(Query);}
//НОВЫЙ ЗАПРОС!!!
Status2 = PdhOpenQueryW(NULL, 0, &Query2);
if(Status2!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
//Добавить счётчик в запрос
Status2 = PdhAddEnglishCounterW(Query2, L"\\Processor(_Total)\\% User Time", 0, &Counter2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status2 = PdhCollectQueryData(Query2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
Sleep(1000);
Status2 = PdhCollectQueryData(Query2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status2 = PdhGetFormattedCounterValue(Counter2,PDH_FMT_DOUBLE,&CounterType2,&DisplayValue2);
if(Status2!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"formatted-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*закрываем запрос*/if (Query2){PdhCloseQuery(Query2);}
}
return 0;
}
//функцияint func(HWND hwnd)
{
//Создаём
CB=GetDlgItem(hwnd,COMBO);
LB=GetDlgItem(hwnd,LIST);
//очищаем :
SendMessage(LB, LB_RESETCONTENT, 0, 0);
SendMessage(CB,LB_RESETCONTENT,0,0);
//Создать запрос
Status = PdhOpenQueryW(NULL, 0, &Query);
if(Status!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
//Добавить счётчик в запрос
Status = PdhAddEnglishCounterW(Query, L"\\Processor(_Total)\\% Privileged Time", 0, &Counter);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
Sleep(1000);
Status = PdhCollectQueryData(Query);
if (Status != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status = PdhGetFormattedCounterValue(Counter,PDH_FMT_DOUBLE,&CounterType,&DisplayValue);
if(Status!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"formatted-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*закрываем запрос*/if (Query){PdhCloseQuery(Query);}
//НОВЫЙ ЗАПРОС!!!
Status2 = PdhOpenQueryW(NULL, 0, &Query2);
if(Status2!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"open-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
//Добавить счётчик в запрос
Status2 = PdhAddEnglishCounterW(Query2, L"\\Processor(_Total)\\% User Time", 0, &Counter2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"add-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Собирает текущее необработанное значение данных для всех счетчиков в указанном запросе
и обновляет код состояния каждого счетчика*/
Status2 = PdhCollectQueryData(Query2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
Sleep(1000);
Status2 = PdhCollectQueryData(Query2);
if (Status2 != ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"collect-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*Вычислить отображаемое значение для указанного счетчика.*/
Status2 = PdhGetFormattedCounterValue(Counter2,PDH_FMT_DOUBLE,&CounterType2,&DisplayValue2);
if(Status2!=ERROR_SUCCESS)
{
MessageBox(hwnd,(LPSTR)"formatted-NOT OK",(LPCSTR)"",MB_OK);
EndDialog(hwnd,NULL);
return TRUE;
}
/*закрываем запрос*/if (Query2){PdhCloseQuery(Query2);}
}
Ошибок не выдаёт , но при запуске бред какой-то получается . Нули выводит. Сил уже нету , не пойму , что к чему