Windows系统CPU内存网络性能统计第二篇 CPU CPU整体使用率

本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5160810

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8678359

欢迎关注微博:http://weibo.com/MoreWindows

 

上一篇《Windows系统CPU内存网络性能统计第一篇内存》(http://blog.csdn.net/morewindows/article/details/8459219)介绍了在Windows系统下如何查看系统内存总量,使用率等信息。接下在将用三篇博客来介绍如何获取CPU整体使用率及多核CPU各核的使用率。

Windows系统CPU内存网络性能统计博客目录:

1.《Windows系统CPU内存网络性能统计第一篇内存》

http://blog.csdn.net/morewindows/article/details/8459219

2.《Windows系统CPU内存网络性能统计第二篇 CPU CPU整体使用率》

http://blog.csdn.net/morewindows/article/details/8678359

3.《Windows系统CPU内存网络性能统计第三篇 CPU 多核CPU各核使用率 C#》

http://blog.csdn.net/morewindows/article/details/8678382

4.《Windows系统CPU内存网络性能统计第四篇 CPU多核CPU各核使用率 C++》

http://blog.csdn.net/morewindows/article/details/8678396

 

    如何获取CPU整体使用率及多核CPU各核的使用率在网上已经有很多文章了,在各大论坛上也有很多人在提问。本人在网上搜索了下,之前很多文章都是介绍使用ntdll.dll中一个未公开的API函数——NtQuerySystemInformation。基本代码结构如下:

// 获得系统CPU使用率 By MoreWindows( http://blog.csdn.net/MoreWindows )

typedef LONG (WINAPI *PROCNTQSI)(UINTPVOIDULONGPULONG);

pFunNtQuerySystemInf = (PROCNTQSI)GetProcAddress(GetModuleHandle("ntdll"),"NtQuerySystemInformation");

    这种方法肯定不太好,这个API函数既然未公开,那么说明微软公司不支持开发应用程序时直接使用这个函数,并且在以后的系统升级中ntdll.dll很可能去掉这个API函数。经过本人MoreWindowshttp://weibo.com/MoreWindows)的实地测试,这种使用NtQuerySystemInformation的程序在Win7下都无法获取CPU使用率。

      

    为了让我们的代码能在WinXP及Win7多系统中正常运行。本人实现了一个CCPUUseRate类。下面是这个CCPUUseRate类的实现代码:

[cpp]  view plain copy
  1. // 获得系统CPU使用率  
  2. // http://blog.csdn.net/morewindows/article/details/8678359  
  3. // By MoreWindows( http://blog.csdn.net/MoreWindows )  
  4. // 先调用Initialize(),然后while(true){Sleep(1000);GetCPUUseRate();}就能获得CPU使用率。  
  5. // 经过测试,可以在WinXP及Win7下使用。  
  6. class CCPUUseRate  
  7. {  
  8. public:  
  9.     BOOL Initialize()   
  10.     {  
  11.         FILETIME ftIdle, ftKernel, ftUser;  
  12.         BOOL flag = FALSE;  
  13.         if (flag = GetSystemTimes(&ftIdle, &ftKernel, &ftUser))  
  14.         {  
  15.             m_fOldCPUIdleTime = FileTimeToDouble(ftIdle);  
  16.             m_fOldCPUKernelTime = FileTimeToDouble(ftKernel);  
  17.             m_fOldCPUUserTime = FileTimeToDouble(ftUser);  
  18.   
  19.         }  
  20.         return flag;  
  21.     }  
  22.     //调用Initialize后要等待1秒再调用此函数  
  23.     int GetCPUUseRate()  
  24.     {  
  25.         int nCPUUseRate = -1;  
  26.         FILETIME ftIdle, ftKernel, ftUser;  
  27.         if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser))  
  28.         {  
  29.             double fCPUIdleTime = FileTimeToDouble(ftIdle);  
  30.             double fCPUKernelTime = FileTimeToDouble(ftKernel);  
  31.             double fCPUUserTime = FileTimeToDouble(ftUser);  
  32.             nCPUUseRate= (int)(100.0 - (fCPUIdleTime - m_fOldCPUIdleTime)   
  33.                 / (fCPUKernelTime - m_fOldCPUKernelTime + fCPUUserTime - m_fOldCPUUserTime)   
  34.                 *100.0);  
  35.             m_fOldCPUIdleTime = fCPUIdleTime;  
  36.             m_fOldCPUKernelTime = fCPUKernelTime;  
  37.             m_fOldCPUUserTime = fCPUUserTime;  
  38.         }  
  39.         return nCPUUseRate;  
  40.     }  
  41. private:  
  42.     double FileTimeToDouble(FILETIME &filetime)  
  43.     {  
  44.         return (double)(filetime.dwHighDateTime * 4.294967296E9) + (double)filetime.dwLowDateTime;  
  45.     }  
  46. private:  
  47.     double m_fOldCPUIdleTime;  
  48.     double m_fOldCPUKernelTime;  
  49.     double m_fOldCPUUserTime;  
  50. };  

    这个类的使用非常简单。先调用Initialize(),然后使用类似于如下代码

while(true)

{

Sleep(1000);

GetCPUUseRate();

}就能获得CPU使用率。

下面是使用范例,程序中printf\r可以参考《C/C++ 在控制台下显示进度》(http://blog.csdn.net/morewindows/article/details/6742078):

[cpp]  view plain copy
  1. // Windows系统CPU内存网络性能统计第二篇 CPU CPU整体使用率  
  2. // 经过测试,可以在WinXP及Win7下使用  
  3. //http://blog.csdn.net/morewindows/article/details/8678359  
  4. #include <windows.h>  
  5. #include <stdio.h>  
  6. #include <conio.h>  
  7. int main()  
  8. {  
  9.     printf("    Windows系统CPU内存网络性能统计第二篇 CPU CPU整体使用率\n");    
  10.     printf(" - http://blog.csdn.net/morewindows/article/details/8678359 -\n");  
  11.     printf(" -- By MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");    
  12.   
  13.     CCPUUseRate cpuUseRate;  
  14.     if (!cpuUseRate.Initialize())  
  15.     {  
  16.         printf("Error! %d\n", GetLastError());  
  17.         getch();  
  18.         return -1;  
  19.     }  
  20.     else  
  21.     {  
  22.         while (true)  
  23.         {     
  24.             Sleep(1000);  
  25.             printf("\r当前CPU使用率为:%4d%%", cpuUseRate.GetCPUUseRate());  
  26.         }  
  27.     }  
  28.     return 0;  
  29. }  

WinXP系统运行结果如下(本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5160810):

Win7系统运行结果如下(本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5160810):

 

本文《Windows系统CPU内存网络性能统计第二篇 CPU CPU整体使用率》(http://blog.csdn.net/morewindows/article/details/8678359)介绍的是如何获取CPU的整体使用率,现大多为多核的CPU,因此如何获取多核CPU各核的使用率了。请看下面二篇——

3Windows系统CPU内存网络性能统计第三篇 CPU 多核CPU各核使用率 C#

http://blog.csdn.net/morewindows/article/details/8678382

4Windows系统CPU内存网络性能统计第四篇 CPU多核CPU各核使用率 C++

http://blog.csdn.net/morewindows/article/details/8678396

 

 

本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5160810

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8678359

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值