VC下使用 Windows 的性能计数器简介
2006-07-20 11:41:28 来源:WEB开发网通过刚才杖举得到计数器对象就可以继续杖举该对象下的计数器和计数器实例,方法和上面基本雷同,有兴趣的朋友可以自己来做,限于篇幅我就不重复了。
我在说说如何知道计数器的描述信息(可是中文的哦!),也就是每个计数器都代表什么含义?干什么用的?要知道每个计数器描述信息需要用到PdhGetCounterInfo函数(都是在pdh开头的API中打转)。
基本步骤如下:
1、格式化某一个计数器地址(字符串),在这里需要说明一下:有很多计数器是没有实例的。有实例和没有实例的格式化形式略有不同。比如:
(有实例的)获取当前写入操作时传送到磁盘上的字节速度:需要用到”PhysicalDisk“计数器对象、该计数器对象下的"Disk Write Bytes/sec"计数器、以及计数器实例(在我的机子上主硬盘的实例为 "0 C: D: E: F:" ) ,那么获取我传送到主硬盘上的字节速度的计数器地址为 : "\PhysicalDisk("0 C: D: E: F:")\Disk Write Bytes/sec" 。
(无实例的)获取本计算机自上次启动后已经运行的时间(单位秒):需要用到"System"计数器对象、盖计数器对象下的"System Up Time"计数器、无实例,那么这个地址为: "\System\System Up Time" 。
2、创建计数器PdhAddCounter
3、分配接收描述信息的缓冲区
4、获取描述信息
以下是程序实现:
__try
至此,关于性能计数器的简单介绍到此完毕。前面啰里啰唆说一大串,主要是考虑到刚接触VC不久的朋友,如果本文能对他们有帮助我将不胜荣幸。略有VC编程经验的人肯定对此文嗤之以鼻,希望看在广大初学者的份上(包括我)请不要言语攻击我。希望有经验的朋友多提宝贵意见、多斧正。
{
// 创建计数器
pdhStatus = PdhAddCounter ( hQuery,
_TEXT ( "\\System\\System Up Time" ),
0,pCounterHandle );
if ( pdhStatus != ERROR_SUCCESS )
{
__leave ;
}
// 分配接收描述信息的缓冲区
DWORD dwCounterBuff ;
BYTE byCounterBuff [ sizeof ( PDH_COUNTER_INFO ) + sizeof ( TCHAR ) * 2048 ];
dwCounterBuff = sizeof ( byCounterBuff );
// 获取描述信息
pdhStatus = PdhGetCounterInfo ( * pCounterHandle,
TRUE,
& dwCounterBuff,
( PPDH_COUNTER_INFO ) byCounterBuff );
if ( pdhStatus != ERROR_SUCCESS )
{
__leave ;
}
PDH_COUNTER_INFO pdhCounterInfo = * ( PPDH_COUNTER_INFO ) byCounterBuff;
// 有关PDH_COUNTER_INFO结构的信息请参阅MSDN
// PDH_COUNTER_INFO结构中包含了很多关于计数器的信息,其中szExplainText为计数器描述信息
// pdhCounterInfo.szExplainText
}
__finally
{
if ( AbnormalTermination () )
{
// 如果失败
}
else
{
// 如果成功
}
}
最后说明:
- 本文采用的是UNICODE编码,其中用到了一些宏,如果要不加修改直接通过编译请在编译器中选择UNICODE编码,并在头文件中添加 #include (略作修改就可在ANSI编码下运行);
- 本文用到的__try {} __finally {} 只是结构化异常处理SEH,可以不要;
- 需要本文例子工程及源代码的朋友请到我的主页上来下载 www.Clock.5888.com;
- 性能计数器只能用在2000/Xp系统(2003没试过);
- 本文代码编译环境 Windows 2000 + VC.net;
- 欢迎转载,转载请注明文章作者和出处;
更多精彩
赞助商链接