Windows系统CPU内存网络性能统计第三篇 CPU 多核CPU各核使用率C#
2013-12-16 00:18
567 查看
本文配套程序下载地址为: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)(UINT, PVOID, ULONG, PULONG);
pFunNtQuerySystemInf = (PROCNTQSI)GetProcAddress(GetModuleHandle("ntdll"),"NtQuerySystemInformation");
这种方法肯定不太好,这个API函数既然未公开,那么说明微软公司不支持开发应用程序时直接使用这个函数,并且在以后的系统升级中ntdll.dll很可能去掉这个API函数。经过本人MoreWindows(http://weibo.com/MoreWindows)的实地测试,这种使用NtQuerySystemInformation的程序在Win7下都无法获取CPU使用率。
为了让我们的代码能在WinXP及Win7多系统中正常运行。本人实现了一个CCPUUseRate类。下面是这个CCPUUseRate类的实现代码:
[cpp] view
plaincopy
// 获得系统CPU使用率
// http://blog.csdn.net/morewindows/article/details/8678359
// By MoreWindows( http://blog.csdn.net/MoreWindows )
// 先调用Initialize(),然后while(true){Sleep(1000);GetCPUUseRate();}就能获得CPU使用率。
// 经过测试,可以在WinXP及Win7下使用。
class CCPUUseRate
{
public:
BOOL Initialize()
{
FILETIME ftIdle, ftKernel, ftUser;
BOOL flag = FALSE;
if (flag = GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
{
m_fOldCPUIdleTime = FileTimeToDouble(ftIdle);
m_fOldCPUKernelTime = FileTimeToDouble(ftKernel);
m_fOldCPUUserTime = FileTimeToDouble(ftUser);
}
return flag;
}
//调用Initialize后要等待1秒再调用此函数
int GetCPUUseRate()
{
int nCPUUseRate = -1;
FILETIME ftIdle, ftKernel, ftUser;
if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
{
double fCPUIdleTime = FileTimeToDouble(ftIdle);
double fCPUKernelTime = FileTimeToDouble(ftKernel);
double fCPUUserTime = FileTimeToDouble(ftUser);
nCPUUseRate= (int)(100.0 - (fCPUIdleTime - m_fOldCPUIdleTime)
/ (fCPUKernelTime - m_fOldCPUKernelTime + fCPUUserTime - m_fOldCPUUserTime)
*100.0);
m_fOldCPUIdleTime = fCPUIdleTime;
m_fOldCPUKernelTime = fCPUKernelTime;
m_fOldCPUUserTime = fCPUUserTime;
}
return nCPUUseRate;
}
private:
double FileTimeToDouble(FILETIME &filetime)
{
return (double)(filetime.dwHighDateTime * 4.294967296E9) + (double)filetime.dwLowDateTime;
}
private:
double m_fOldCPUIdleTime;
double m_fOldCPUKernelTime;
double m_fOldCPUUserTime;
};
这个类的使用非常简单。先调用Initialize(),然后使用类似于如下代码
while(true)
{
Sleep(1000);
GetCPUUseRate();
}就能获得CPU使用率。
下面是使用范例,程序中printf的\r可以参考《C/C++ 在控制台下显示进度》(http://blog.csdn.net/morewindows/article/details/6742078):
[cpp] view
plaincopy
// Windows系统CPU内存网络性能统计第二篇 CPU CPU整体使用率
// 经过测试,可以在WinXP及Win7下使用
//http://blog.csdn.net/morewindows/article/details/8678359
#include <windows.h>
#include <stdio.h>
#include <conio.h>
int main()
{
printf(" Windows系统CPU内存网络性能统计第二篇 CPU CPU整体使用率\n");
printf(" - http://blog.csdn.net/morewindows/article/details/8678359 -\n");
printf(" -- By MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");
CCPUUseRate cpuUseRate;
if (!cpuUseRate.Initialize())
{
printf("Error! %d\n", GetLastError());
getch();
return -1;
}
else
{
while (true)
{
Sleep(1000);
printf("\r当前CPU使用率为:%4d%%", cpuUseRate.GetCPUUseRate());
}
}
return 0;
}
在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各核的使用率了。请看下面二篇——
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
本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5160810
转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8678359
转载请标明出处,原文地址: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)(UINT, PVOID, ULONG, PULONG);
pFunNtQuerySystemInf = (PROCNTQSI)GetProcAddress(GetModuleHandle("ntdll"),"NtQuerySystemInformation");
这种方法肯定不太好,这个API函数既然未公开,那么说明微软公司不支持开发应用程序时直接使用这个函数,并且在以后的系统升级中ntdll.dll很可能去掉这个API函数。经过本人MoreWindows(http://weibo.com/MoreWindows)的实地测试,这种使用NtQuerySystemInformation的程序在Win7下都无法获取CPU使用率。
为了让我们的代码能在WinXP及Win7多系统中正常运行。本人实现了一个CCPUUseRate类。下面是这个CCPUUseRate类的实现代码:
[cpp] view
plaincopy
// 获得系统CPU使用率
// http://blog.csdn.net/morewindows/article/details/8678359
// By MoreWindows( http://blog.csdn.net/MoreWindows )
// 先调用Initialize(),然后while(true){Sleep(1000);GetCPUUseRate();}就能获得CPU使用率。
// 经过测试,可以在WinXP及Win7下使用。
class CCPUUseRate
{
public:
BOOL Initialize()
{
FILETIME ftIdle, ftKernel, ftUser;
BOOL flag = FALSE;
if (flag = GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
{
m_fOldCPUIdleTime = FileTimeToDouble(ftIdle);
m_fOldCPUKernelTime = FileTimeToDouble(ftKernel);
m_fOldCPUUserTime = FileTimeToDouble(ftUser);
}
return flag;
}
//调用Initialize后要等待1秒再调用此函数
int GetCPUUseRate()
{
int nCPUUseRate = -1;
FILETIME ftIdle, ftKernel, ftUser;
if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
{
double fCPUIdleTime = FileTimeToDouble(ftIdle);
double fCPUKernelTime = FileTimeToDouble(ftKernel);
double fCPUUserTime = FileTimeToDouble(ftUser);
nCPUUseRate= (int)(100.0 - (fCPUIdleTime - m_fOldCPUIdleTime)
/ (fCPUKernelTime - m_fOldCPUKernelTime + fCPUUserTime - m_fOldCPUUserTime)
*100.0);
m_fOldCPUIdleTime = fCPUIdleTime;
m_fOldCPUKernelTime = fCPUKernelTime;
m_fOldCPUUserTime = fCPUUserTime;
}
return nCPUUseRate;
}
private:
double FileTimeToDouble(FILETIME &filetime)
{
return (double)(filetime.dwHighDateTime * 4.294967296E9) + (double)filetime.dwLowDateTime;
}
private:
double m_fOldCPUIdleTime;
double m_fOldCPUKernelTime;
double m_fOldCPUUserTime;
};
这个类的使用非常简单。先调用Initialize(),然后使用类似于如下代码
while(true)
{
Sleep(1000);
GetCPUUseRate();
}就能获得CPU使用率。
下面是使用范例,程序中printf的\r可以参考《C/C++ 在控制台下显示进度》(http://blog.csdn.net/morewindows/article/details/6742078):
[cpp] view
plaincopy
// Windows系统CPU内存网络性能统计第二篇 CPU CPU整体使用率
// 经过测试,可以在WinXP及Win7下使用
//http://blog.csdn.net/morewindows/article/details/8678359
#include <windows.h>
#include <stdio.h>
#include <conio.h>
int main()
{
printf(" Windows系统CPU内存网络性能统计第二篇 CPU CPU整体使用率\n");
printf(" - http://blog.csdn.net/morewindows/article/details/8678359 -\n");
printf(" -- By MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");
CCPUUseRate cpuUseRate;
if (!cpuUseRate.Initialize())
{
printf("Error! %d\n", GetLastError());
getch();
return -1;
}
else
{
while (true)
{
Sleep(1000);
printf("\r当前CPU使用率为:%4d%%", cpuUseRate.GetCPUUseRate());
}
}
return 0;
}
在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各核的使用率了。请看下面二篇——
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
本文配套程序下载地址为:http://download.csdn.net/detail/morewindows/5160810
转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8678359
相关文章推荐
- Windows系统CPU内存网络性能统计第二篇 CPU CPU整体使用率
- 腾创网络视频会议软件
- 网站建设第三步:宁波网络公司现状
- 如何利用花生壳动态域名解析服务搭建http服务。
- 网络编程:Reactor和Proactor模式
- HttpContext.Cache 详解
- 关于使用Java进行网络编程
- HTTP协议方法以及报头分析
- 开源网络库的分析libevent muduo nginx ....
- wubi.exe无法安装ubuntu12.04以及长时间等待amd64.tar.xz的解决方法
- 【centos6 , 7】 网络原理、网络配置
- 测试WWW方案(反向代理,负载均衡,HTTP加速缓存)
- ASIHTTPRequest系列(三):文件上传
- ASIHTTPRequest系列(二):文件下载
- ASIHTTPRequest系列(一):同步和异步请求
- (unix网络编程)tcp回射程序一:基本实现
- Windows TCP协议网络编程
- Chrome高性能网络 -- Chrome内部的各种优化
- 部分 TCP 内核参数彻底了解
- BP神经网络设计的matlab简单实现