- 论坛徽章:
- 0
|
windows下使用PDH获取CPU的利用率,统计的数据很不正确,期待各位高手指点一二。代码如下:
- #include <windows.h>
- #include <tchar.h>
- #include <stdio.h>
- #include <pdh.h>
- #include <conio.h>
- #pragma comment(lib, "pdh.lib")
- CONST ULONG SAMPLE_INTERVAL_MS = 1000;
- int getCpuUsage(int flag){
- HQUERY hQuery = NULL;
- CONST ULONG SAMPLE_INTERVAL_MS = 1000;
- PDH_STATUS pdhStatus;
- pdhStatus = PdhOpenQuery(NULL,NULL, &hQuery);
- if(pdhStatus != ERROR_SUCCESS) {
- return -1;
- }
- HCOUNTER hCounter;
- //if(flag)
- {
- // printf("2008 os\n");
- // pdhStatus = PdhAddCounter(hQuery,"\\Processor(*)\\% Processor Time", 0, &hCounter);
- }
- // else
- {
- printf(" 2003 os and 2008 \n");
- PDH_COUNTER_PATH_ELEMENTS pcpe;
- TCHAR szFullPathBuffer[MAX_PATH] = TEXT("");
- DWORD dwSize = sizeof(szFullPathBuffer);
- pcpe.szMachineName = TEXT("127.0.0.1");
- pcpe.szObjectName = TEXT("Processor");
- pcpe.szInstanceName = TEXT("_Total");
- pcpe.szCounterName = TEXT("% Processor Time");
- pcpe.dwInstanceIndex = -1;
- pcpe.szParentInstance = NULL;
- pdhStatus = PdhMakeCounterPath(&pcpe, szFullPathBuffer, &dwSize, 0);
- if(pdhStatus != ERROR_SUCCESS) {
- goto exit_prog;
- }
- pdhStatus = PdhAddCounter(hQuery, szFullPathBuffer, 0, &hCounter);
- //pdhStatus = PdhAddCounter(hQuery,"\\Processor(_Total)\\% Processor Time", 0, &hCounter);
- //pdhStatus = PdhAddCounter(hQuery, _TEXT ( "Processor(_Total)\\%Processor Time" ), 0, &hCounter);
- //pdhStatus = PdhAddCounter(hQuery,"\\SUPER\\Processor(_Total)\\% Processor Time", 1, &hCounter);
- }
- if(pdhStatus != ERROR_SUCCESS) {
- goto exit_prog;
- }
- pdhStatus = PdhCollectQueryData(hQuery);
- if(pdhStatus != ERROR_SUCCESS) {
- goto exit_prog;
- }
- PDH_FMT_COUNTERVALUE pfc;
- DWORD dwOpt;
- Sleep(SAMPLE_INTERVAL_MS);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- Sleep(100);
- pdhStatus = PdhCollectQueryData(hQuery);
- pdhStatus = PdhGetFormattedCounterValue(hCounter,PDH_FMT_LONG,NULL,&pfc);
- // pdhStatus = PdhGetFormattedCounterValue(hCounter,PDH_FMT_DOUBLE,&dwOpt,&pfc);
- if(pdhStatus == ERROR_SUCCESS) {
- if(hQuery) {
- PdhCloseQuery(hQuery);
- }
- //wprintf(L",\"%.20g\n", pfc.doubleValue);
- printf("long value is %u\n",pfc.longValue);
- //int ret = (int)((pfc.doubleValue*100)+0.5)/100.0;
- int ret = (int)(pfc.doubleValue + 0.5);
- //printf("ret is %d\n",ret);
- return ret;
- }
- else
- {
- goto exit_prog;
- }
- exit_prog:
- if(hQuery)
- PdhCloseQuery(hQuery);
- return -1;
- }
- int main(void){
- while (1)
- int ret = getCpuUsage(0);
- return 0;
- }
复制代码 |
|