我想获取多CPU的OS下总CPU的使用率(允许和任务管理器中的存在着一点误差),下面的程序中获取的值不正确,小弟菜鸟,哪位高手能指点小弟一下,不胜感激.
我在网上找到过用NtQuerySystemInformation这个API实现的,可是这种方法对于多CPU存在的误差比较大,所以想用下面的方法.用别的方法也可以.麻烦指点一下.谢谢.
#include <windows.h>
#include <Pdh.h>
#include <iostream>
#pragma comment(lib ,"pdh.lib")
using namespace std;
int main()
{
HQUERY hQuery = NULL;
PDH_STATUS pdhStatus;
HCOUNTER *pCounterHandle = NULL;
//打开计数器
pdhStatus = PdhOpenQuery ( 0 , 0 , & hQuery );
if (pdhStatus != ERROR_SUCCESS)
{
cout << "error" << endl;
}
pCounterHandle = ( HCOUNTER *) GlobalAlloc ( GPTR , sizeof ( HCOUNTER ) );
if (pCounterHandle == NULL)
{
cout << "error" << endl;
} PDH_FMT_COUNTERVALUE fmtValue;
DWORD dwctrType;
pdhStatus = PdhAddCounter(hQuery, TEXT("\\Processor(_Total)\\% Processor Time"), 0, pCounterHandle );

if (pdhStatus != ERROR_SUCCESS)
{
cout << "error" << endl;
}
pdhStatus = PdhCollectQueryData( hQuery );

//得到当前计数器值
pdhStatus = PdhGetFormattedCounterValue ( *pCounterHandle , PDH_FMT_DOUBLE , &dwctrType , &fmtValue );

// fmtValue.doubleValue就是当前此时此刻该程序的CPU使用率(循环调用就可得到实时数据) 
cout << fmtValue.doubleValue << endl;
pdhStatus = PdhCloseQuery ( hQuery );
if ( pdhStatus == ERROR_SUCCESS )
{
// 关闭成功
}
else
{
// 关闭失败
}
system("pause");
return 0;
}

解决方案 »

  1.   


    HQUERY hQuery;
        PDH_STATUS pdhStatus = PdhOpenQuery(0, 0, &hQuery);
        HCOUNTER pCounterHandle;
        PDH_FMT_COUNTERVALUE fmtValue;
        DWORD dwctrType;
        pdhStatus = PdhAddCounter(hQuery, _TEXT("\\Process(conhost)\\% Processor Time"), 0, &pCounterHandle);
        pdhStatus = PdhCollectQueryData(hQuery);
        Sleep(1000);
        pdhStatus = PdhCollectQueryData(hQuery);
        pdhStatus = PdhGetFormattedCounterValue(pCounterHandle, PDH_FMT_DOUBLE, &dwctrType, &fmtValue);
        pdhStatus = PdhCloseQuery(hQuery);通过SetProcessAffinityMask 设置CPU亲缘性,确定你的进程跑在制定的一个核心上,那么获得的就是那个核的CPU使用率
      

  2.   

    我想要获得是整个CPU的使用率.不是某一个进程的CPU使用率.
      

  3.   

    这个就是整个CPU核心的。
      

  4.   

    单个进程的CPU占用率PdhAddCounter调用就不是这么写了
      

  5.   

    不好意思看错了,把\\Process(conhost)\\% Processor Time换成 \\Process(_Total)\% Processor Time获得的就是总共的CPU占用率了。#5#6楼作废
      

  6.   

    #include <windows.h>
    #include <Pdh.h>
    #include <iostream>using namespace std;#pragma comment (lib, "Pdh.lib")int main()
    {
    HQUERY hQuery; 
        PDH_STATUS pdhStatus= PdhOpenQuery(0,0,&hQuery); 
        HCOUNTER pCounterHandle; 
        PDH_FMT_COUNTERVALUE fmtValue; 
        DWORD dwctrType; 
        pdhStatus= PdhAddCounter(hQuery, TEXT("\\Process(_Total)\\% Processor Time"),0,&pCounterHandle); 
        pdhStatus= PdhCollectQueryData(hQuery); 
        Sleep(1000); 
        pdhStatus= PdhCollectQueryData(hQuery); 
        pdhStatus= PdhGetFormattedCounterValue(pCounterHandle, PDH_FMT_DOUBLE,&dwctrType,&fmtValue); 
    cout << fmtValue.doubleValue << endl;
        pdhStatus= PdhCloseQuery(hQuery); 
    system("pause");
    return 0;
    }
    这个贴你的代码,为什么输出之后,值总为100呢?还有就是,你的程序,和我的程序有同之处在什么地方?