我想获取多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;
}
我在网上找到过用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;
}
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使用率
#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呢?还有就是,你的程序,和我的程序有同之处在什么地方?