使用性能计数器的基本步骤是:
1.打开计数器PdhOpenQuery
1.打开计数器PdhOpenQuery
2.为计数器句柄分配空间
3.把感兴趣的计数器添加进来PdhAddCounter4.收集数据PdhCollectQueryData
5.得到计数器的数值PdhGetFormattedCounterValue
6.关闭计数器PdhCloseQuery
#include <iostream>
#include <Pdh.h>
#include <list>
#include <string>
#include <numeric>
#pragma comment(lib, "Pdh.lib")
using namespace std;
void main()
{
list< HCOUNTER> m_counters;
HQUERY m_hQuery;
string counter_list;
string instance_list;
DWORD clistlen = 0;
DWORD ilistlen = 0;
const char * netface = "Network Interface";
const char * in_speed = "Bytes Received/sec";
const char * out_speed = "Bytes Sent/sec";
list< double> m_net_total_in_bps;
list< double> m_net_total_out_bps;
PdhEnumObjectItemsA(0, 0, netface, 0, &clistlen, 0, &ilistlen, PERF_DETAIL_WIZARD, 0);
counter_list.assign(clistlen, 0);
instance_list.assign(ilistlen, 0);
if (ERROR_SUCCESS != PdhEnumObjectItemsA(0, 0, netface, &counter_list[0], &clistlen,
&instance_list[0], &ilistlen, PERF_DETAIL_WIZARD, 0))
return;
PDH_STATUS pdhStatus;
pdhStatus = PdhOpenQuery (0, 0, &m_hQuery);
if ( pdhStatus != ERROR_SUCCESS )
return;
char *tmpsz = &instance_list[0];
// 枚举网卡
for (; *tmpsz!=0; tmpsz+=(strlen(tmpsz)+1))
{
string query_obj_in = string("\\") + netface + "(" + tmpsz + ")" + "\\"
+ in_speed;
string query_obj_out = string("\\") + netface + "(" + tmpsz + ")" + "\\"
+ out_speed;
HCOUNTER tmpcounter;
pdhStatus = PdhAddCounterA( m_hQuery , query_obj_in.c_str(), 0 , &tmpcounter ) ;
if ( pdhStatus != ERROR_SUCCESS )
{
PdhCloseQuery(m_hQuery) ;
return;
}
m_counters.push_back(tmpcounter);
pdhStatus = PdhAddCounterA(m_hQuery, query_obj_out.c_str(), 0 , &tmpcounter) ;
if (pdhStatus != ERROR_SUCCESS)
{
PdhCloseQuery (m_hQuery) ;
return;
}
m_counters.push_back(tmpcounter);
}
// 统计流量,每秒一次
while(1)
{
PDH_FMT_COUNTERVALUE fmtValue;
DWORD dwctrType;
pdhStatus = PdhCollectQueryData(m_hQuery);
if (pdhStatus != ERROR_SUCCESS)
{
return;
}
double in_bps = 0.0;
double out_bps = 0.0;
double in_avg_bps = 0.0;
double out_avg_bps = 0.0;
// 遍历每块网卡,把流量加起来
for (list< HCOUNTER>::iterator iter = m_counters.begin();
iter != m_counters.end();
iter++)
{
pdhStatus = PdhGetFormattedCounterValue(*iter , PDH_FMT_DOUBLE , &dwctrType,
&fmtValue ) ;
if ( pdhStatus == ERROR_SUCCESS )
{
in_bps += fmtValue.doubleValue;
}
iter ++;
pdhStatus = PdhGetFormattedCounterValue(*iter, PDH_FMT_DOUBLE, &dwctrType,
&fmtValue ) ;
if ( pdhStatus == ERROR_SUCCESS )
{
out_bps += fmtValue.doubleValue;
}
}
m_net_total_in_bps.push_back(in_bps);
m_net_total_out_bps.push_back(out_bps);
if (m_net_total_in_bps.size() > 10)
m_net_total_in_bps.pop_front();
if (m_net_total_out_bps.size() > 10)
m_net_total_out_bps.pop_front();
in_avg_bps = accumulate(m_net_total_in_bps.begin(), m_net_total_in_bps.end(), 0.0)
/ m_net_total_in_bps.size();
out_avg_bps = accumulate(m_net_total_out_bps.begin(), m_net_total_out_bps.end(),
0.0) / m_net_total_out_bps.size();
cout << "IN = " << in_avg_bps/1024 << "KBps" << endl;
cout << "OUT = " << out_avg_bps/1024 << "KBps" << endl;
Sleep(1000);
}
}
原文地址:http://www.sizeof.cn/html/2009/76.html