免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4441 | 回复: 2
打印 上一主题 下一主题

PDH获取CPU利用率统计不正确的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-24 14:37 |只看该作者 |倒序浏览
windows下使用PDH获取CPU的利用率,统计的数据很不正确,期待各位高手指点一二。代码如下:

  1. #include <windows.h>
  2. #include <tchar.h>
  3. #include <stdio.h>
  4. #include <pdh.h>
  5. #include <conio.h>
  6. #pragma comment(lib, "pdh.lib")
  7. CONST ULONG SAMPLE_INTERVAL_MS    = 1000;
  8. int getCpuUsage(int flag){
  9.         HQUERY hQuery = NULL;
  10.         CONST ULONG SAMPLE_INTERVAL_MS    = 1000;
  11.         PDH_STATUS pdhStatus;

  12.         pdhStatus = PdhOpenQuery(NULL,NULL, &hQuery);  
  13.         if(pdhStatus != ERROR_SUCCESS) {
  14.                 return -1;  
  15.         }  
  16.         HCOUNTER hCounter;  
  17.         //if(flag)
  18.         {
  19. //                printf("2008 os\n");
  20. //                pdhStatus = PdhAddCounter(hQuery,"\\Processor(*)\\% Processor Time", 0, &hCounter);  
  21.         }
  22. //        else
  23.         {
  24.                 printf(" 2003 os and 2008 \n");
  25.                 PDH_COUNTER_PATH_ELEMENTS pcpe;  
  26.                 TCHAR szFullPathBuffer[MAX_PATH] = TEXT("");  
  27.                 DWORD dwSize = sizeof(szFullPathBuffer);  

  28.                 pcpe.szMachineName = TEXT("127.0.0.1");  
  29.                 pcpe.szObjectName = TEXT("Processor");  
  30.                 pcpe.szInstanceName = TEXT("_Total");  
  31.                 pcpe.szCounterName = TEXT("% Processor Time");  
  32.                 pcpe.dwInstanceIndex = -1;  
  33.                 pcpe.szParentInstance = NULL;  

  34.                 pdhStatus = PdhMakeCounterPath(&pcpe, szFullPathBuffer, &dwSize, 0);  
  35.                 if(pdhStatus != ERROR_SUCCESS) {  

  36.                         goto exit_prog;  
  37.                 }
  38.                 pdhStatus = PdhAddCounter(hQuery, szFullPathBuffer, 0, &hCounter);
  39.                 //pdhStatus = PdhAddCounter(hQuery,"\\Processor(_Total)\\% Processor Time", 0, &hCounter);
  40.                 //pdhStatus = PdhAddCounter(hQuery, _TEXT ( "Processor(_Total)\\%Processor Time" ), 0, &hCounter);         
  41.                 //pdhStatus = PdhAddCounter(hQuery,"\\SUPER\\Processor(_Total)\\% Processor Time", 1, &hCounter);
  42.         }


  43.         if(pdhStatus != ERROR_SUCCESS) {  

  44.                 goto exit_prog;  
  45.         }  
  46.         pdhStatus = PdhCollectQueryData(hQuery);
  47.         if(pdhStatus != ERROR_SUCCESS) {  

  48.                 goto exit_prog;  
  49.         }
  50.         PDH_FMT_COUNTERVALUE pfc;  
  51.         DWORD dwOpt;
  52.         Sleep(SAMPLE_INTERVAL_MS);
  53.         pdhStatus = PdhCollectQueryData(hQuery);
  54.         Sleep(100);
  55.         pdhStatus = PdhCollectQueryData(hQuery);
  56.                 Sleep(100);
  57.         pdhStatus = PdhCollectQueryData(hQuery);
  58.                 Sleep(100);
  59.         pdhStatus = PdhCollectQueryData(hQuery);
  60.                 Sleep(100);
  61.         pdhStatus = PdhCollectQueryData(hQuery);
  62.                 Sleep(100);
  63.         pdhStatus = PdhCollectQueryData(hQuery);
  64.                 Sleep(100);
  65.         pdhStatus = PdhCollectQueryData(hQuery);
  66.                 Sleep(100);
  67.         pdhStatus = PdhCollectQueryData(hQuery);
  68.                 Sleep(100);
  69.         pdhStatus = PdhCollectQueryData(hQuery);
  70.                 Sleep(100);
  71.         pdhStatus = PdhCollectQueryData(hQuery);
  72.                 Sleep(100);
  73.         pdhStatus = PdhCollectQueryData(hQuery);
  74.                 Sleep(100);
  75.         pdhStatus = PdhCollectQueryData(hQuery);
  76.                 Sleep(100);
  77.         pdhStatus = PdhCollectQueryData(hQuery);
  78.                 Sleep(100);
  79.         pdhStatus = PdhCollectQueryData(hQuery);
  80.                 Sleep(100);
  81.         pdhStatus = PdhCollectQueryData(hQuery);
  82.                 Sleep(100);
  83.         pdhStatus = PdhCollectQueryData(hQuery);
  84.                 Sleep(100);
  85.         pdhStatus = PdhCollectQueryData(hQuery);
  86.                 Sleep(100);
  87.         pdhStatus = PdhCollectQueryData(hQuery);
  88.                 Sleep(100);
  89.         pdhStatus = PdhCollectQueryData(hQuery);
  90.                 Sleep(100);
  91.         pdhStatus = PdhCollectQueryData(hQuery);
  92.                 Sleep(100);
  93.         pdhStatus = PdhCollectQueryData(hQuery);
  94.                 Sleep(100);
  95.         pdhStatus = PdhCollectQueryData(hQuery);
  96.                 Sleep(100);
  97.         pdhStatus = PdhCollectQueryData(hQuery);
  98.                 Sleep(100);
  99.         pdhStatus = PdhCollectQueryData(hQuery);
  100.                 Sleep(100);
  101.         pdhStatus = PdhCollectQueryData(hQuery);
  102.                 Sleep(100);
  103.         pdhStatus = PdhCollectQueryData(hQuery);
  104.                 Sleep(100);
  105.         pdhStatus = PdhCollectQueryData(hQuery);
  106.         pdhStatus = PdhGetFormattedCounterValue(hCounter,PDH_FMT_LONG,NULL,&pfc);  

  107. //        pdhStatus = PdhGetFormattedCounterValue(hCounter,PDH_FMT_DOUBLE,&dwOpt,&pfc);  
  108.         if(pdhStatus == ERROR_SUCCESS) {
  109.                 if(hQuery) {

  110.                         PdhCloseQuery(hQuery);
  111.                 }
  112.                 //wprintf(L",\"%.20g\n", pfc.doubleValue);
  113.                 printf("long value is %u\n",pfc.longValue);
  114.                 //int ret = (int)((pfc.doubleValue*100)+0.5)/100.0;
  115.                 int ret = (int)(pfc.doubleValue + 0.5);
  116.                 //printf("ret is %d\n",ret);
  117.                         return ret;
  118.         }
  119.         else
  120.         {


  121.                 goto exit_prog;
  122.         }
  123. exit_prog:
  124.         if(hQuery)
  125.                 PdhCloseQuery(hQuery);  
  126.         return -1;


  127. }

  128. int main(void){

  129. while (1)
  130. int ret = getCpuUsage(0);
  131. return 0;


  132. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-06-24 14:39 |只看该作者
资源管理器看到的利用率是36%,统计出来的是74左右。系统是多核的。

论坛徽章:
0
3 [报告]
发表于 2011-06-24 14:57 |只看该作者
是不是发错地方了?有人看没人回呀。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP