请问在VC中如何实时获取CPU的使用率?

lcmj520 2011-03-18 02:08:09
大家好,我是初学者,在网上找了很多代码,就是想做一个和任务管理器一样的东西,可以实时获取CPU占用率,但一直都找不到,网上发的代码全是垃圾,我特意运行了,如果有高手能给我一段确实可用的代码,人格保证结贴给分!!

我会一段一段代码测试!

以下是垃圾代码,我经过无数遍修改了,如果有人的代码是直接贴过来的,对不起了:


//#include "targetver.h"
//#include "windows.h"
//#include "winbase.h"
//#include <iostream>
//using namespace std;
//
//#define SystemBasicInformation 0
//#define SystemPerformanceInformation 2
//#define SystemTimeInformation 3
//
//#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))
//
//class CCpuUsage
//{
//public:
// CCpuUsage();
// ~CCpuUsage();
//
//public:
// int GetCpuUsage(); //得到系统cpu利用率
// int SetRefreshInterval(int milli_sec); //定时刷新间隔
//
//private:
// //类型定义
// typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);
//
// typedef struct
// {
// DWORD dwUnknown1;
// ULONG uKeMaximumIncrement;
// ULONG uPageSize;
// ULONG uMmNumberOfPhysicalPages;
// ULONG uMmLowestPhysicalPage;
// ULONG uMmHighestPhysicalPage;
// ULONG uAllocationGranularity;
// PVOID pLowestUserAddress;
// PVOID pMmHighestUserAddress;
// ULONG uKeActiveProcessors;
// BYTE bKeNumberProcessors;
// BYTE bUnknown2;
// WORD wUnknown3;
// } SYSTEM_BASIC_INFORMATION;
//
// typedef struct
// {
// LARGE_INTEGER liIdleTime;
// DWORD dwSpare[76];
// } SYSTEM_PERFORMANCE_INFORMATION;
//
// typedef struct
// {
// LARGE_INTEGER liKeBootTime;
// LARGE_INTEGER liKeSystemTime;
// LARGE_INTEGER liExpTimeZoneBias;
// ULONG uCurrentTimeZoneId;
// DWORD dwReserved;
// } SYSTEM_TIME_INFORMATION;
//
// //变量定义
// SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
// SYSTEM_TIME_INFORMATION SysTimeInfo;
// SYSTEM_BASIC_INFORMATION SysBaseInfo;
//
// double dbIdleTime;
// double dbSystemTime;
//
// LONG status;
//
// LARGE_INTEGER liOldIdleTime;
// LARGE_INTEGER liOldSystemTime;
//
// PROCNTQSI NtQuerySystemInformation;
//
// int m_nCpuUsage;
//
// //定时
// HWND m_hWnd;
// int m_nRefreshInterval;//默认为1000毫秒
// int m_nTimerID;
//
//private:
// static void CalcCpuUsage(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
// int OnTimer();
//};
//
//inline CCpuUsage::CCpuUsage()
//{
// //
// m_hWnd = NULL;
// m_nRefreshInterval = 1000;
// m_nTimerID = 1000;
// m_nCpuUsage = 0;
//
// //
// memset(&liOldIdleTime , 0, sizeof(LARGE_INTEGER));
// memset(&liOldSystemTime, 0, sizeof(LARGE_INTEGER));
//
// //
// NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(
// GetModuleHandle(_T("ntdll")) , "NtQuerySystemInformation");
// if (!NtQuerySystemInformation)
// return;
//
// // get number of processors in the system
// status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);
// if (status != NO_ERROR)
// return;
//
// // create control for timer
// m_hWnd = ::CreateWindow(_T("static"), _T(""), 0, 0, 0, 0, 0, NULL, NULL, 0, NULL);
// ::SetWindowLong(m_hWnd , GWL_USERDATA , (long)(this) );
//
// TIMERPROC tp = (TIMERPROC)CalcCpuUsage;
// SetTimer(m_hWnd , m_nTimerID, m_nRefreshInterval, tp);
//
//}
//
//inline CCpuUsage::~CCpuUsage()
//{
// KillTimer(m_hWnd , m_nTimerID);
// DestroyWindow(m_hWnd);
//}
//
//inline void CCpuUsage::CalcCpuUsage(
// HWND hwnd,
// UINT uMsg,
// UINT_PTR idEvent,
// DWORD dwTime
// )
//{
// CCpuUsage* pCpu = (CCpuUsage*)::GetWindowLong(hwnd , GWL_USERDATA);
//
// if ( pCpu )
// {
// pCpu->OnTimer();
// }
//
//}
//
//inline int CCpuUsage::OnTimer()
//{
// status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);
//
// if (status!=NO_ERROR)
// return 0;
//
// // get new CPU's idle time
// status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
// if (status != NO_ERROR)
// return 0;
//
// // if it's a first call - skip it
// if (liOldIdleTime.QuadPart != 0)
// {
// // CurrentValue = NewValue - OldValue
// dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
// dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);
//
// // CurrentCpuIdle = IdleTime / SystemTime
// dbIdleTime = (double)dbIdleTime / dbSystemTime;
//
// // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
// dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors + 0.5;
//
// m_nCpuUsage = (UINT)dbIdleTime;
// }
//
// // store new CPU's idle and system time
// liOldIdleTime = SysPerfInfo.liIdleTime;
// liOldSystemTime = SysTimeInfo.liKeSystemTime;
//
// // wait one second
//
// return 0;
//}
//
//inline int CCpuUsage::GetCpuUsage()
//{
// return m_nCpuUsage;
//}
//
//inline int CCpuUsage::SetRefreshInterval(int milli_sec)
//{
// m_nRefreshInterval = milli_sec;
//
// if ( m_hWnd )
// {
// TIMERPROC tp = (TIMERPROC)CalcCpuUsage;
// SetTimer(m_hWnd, m_nTimerID, m_nRefreshInterval ,tp);
// }
//
// return 0;
//
//}
//
//CCpuUsage* m_pCPU;
//
//int _tmain(int argc, _TCHAR* argv[])
//{
// m_pCPU = new CCpuUsage();
// //m_pCPU->SetRefreshInterval(100);
// for (int i=1;i<=100;i++)
// {
// cout<<m_pCPU->GetCpuUsage()<<endl;
// //::Sleep(1000);
// }
// return 0;
//}
//

/*--------------------------------------------------------------------------------------------------------------------------*/

/*
#define SystemBasicInformation 0
#define SystemPerformanceInformation 2
#define SystemTimeInformation 3

#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))

typedef struct
{
DWORD dwUnknown1;
ULONG uKeMaximumIncrement;
ULONG uPageSize;
ULONG uMmNumberOfPhysicalPages;
ULONG uMmLowestPhysicalPage;
ULONG uMmHighestPhysicalPage;
ULONG uAllocationGranularity;
PVOID pLowestUserAddress;
PVOID pMmHighestUserAddress;
ULONG uKeActiveProcessors;
BYTE bKeNumberProcessors;
BYTE bUnknown2;
WORD wUnknown3;
} SYSTEM_BASIC_INFORMATION;

typedef struct
{
LARGE_INTEGER liIdleTime;
DWORD dwSpare[76];
} SYSTEM_PERFORMANCE_INFORMATION;

typedef struct
{
LARGE_INTEGER liKeBootTime;
LARGE_INTEGER liKeSystemTime;
LARGE_INTEGER liExpTimeZoneBias;
ULONG uCurrentTimeZoneId;
DWORD dwReserved;
} SYSTEM_TIME_INFORMATION;


// ntdll!NtQuerySystemInformation (NT specific!)
//
// The function copies the system information of the
// specified type into a buffer
//
// NTSYSAPI
// NTSTATUS
// NTAPI
// NtQuerySystemInformation(
// IN UINT SystemInformationClass, // information type
// OUT PVOID SystemInformation, // pointer to buffer
// IN ULONG SystemInformationLength, // buffer size in bytes
// OUT PULONG ReturnLength OPTIONAL // pointer to a 32-bit
// // variable that receives
// // the number of bytes
// // written to the buffer
// );

typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);

PROCNTQSI NtQuerySystemInformation;


void main(void)
{
SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
SYSTEM_TIME_INFORMATION SysTimeInfo;
SYSTEM_BASIC_INFORMATION SysBaseInfo;
double dbIdleTime;
double dbSystemTime;
LONG status;
LARGE_INTEGER liOldIdleTime = {0,0};
LARGE_INTEGER liOldSystemTime = {0,0};

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

if (!NtQuerySystemInformation)
return;

// get number of processors in the system
status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);
if (status != NO_ERROR)
return;

printf("\nCPU Usage (press any key to exit): ");
while(!_kbhit())
{
// get new system time
status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);
if (status!=NO_ERROR)
return;

// get new CPU's idle time
status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
if (status == NO_ERROR)//修改位置
return;

// 本文转自 C++Builder研究 - http://www.ccrun.com/article.asp?i=424&d=7jw23a
// if it's a first call - skip it
if (liOldIdleTime.QuadPart != 0)
{
// CurrentValue = NewValue - OldValue
dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);

// CurrentCpuIdle = IdleTime / SystemTime
dbIdleTime = dbIdleTime / dbSystemTime;

// CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors
dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors + 0.5;

printf("\b\b\b\b%3d%%",(UINT)dbIdleTime);
}

// store new CPU's idle and system time
liOldIdleTime = SysPerfInfo.liIdleTime;
liOldSystemTime = SysTimeInfo.liKeSystemTime;

// wait one second
Sleep(1000);
}
printf("\n");
}
*/
...全文
2608 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
sichouzhilu 2013-07-12
  • 打赏
  • 举报
回复
之前用过这段代码来获取CPU使用率,在32位系统没问题,后来到了64位系统就不行了,不兼容,后来换成GetSystemTimes就行了,取出来的值是需要计算的,不要太频繁地调用,要不不准确。
gg606 2013-07-05
  • 打赏
  • 举报
回复
看了一下MSDN,是不是SYSTEM_PERFORMANCE_INFORMATION在Server2008里定义不一样啊? Win7就多了48字节,如下: SYSTEM_PERFORMANCE_INFORMATION structure On Windows 7 the size of the structure has increased by 48 bytes. The more accurate structure definition is now:
struct SYSTEM_PERFORMANCE_INFORMATION {
    LARGE_INTEGER IdleTime;
    LARGE_INTEGER ReadTransferCount;
    LARGE_INTEGER WriteTransferCount;
    LARGE_INTEGER OtherTransferCount;
    ULONG ReadOperationCount;
    ULONG WriteOperationCount;
    ULONG OtherOperationCount;
    ULONG AvailablePages;
    ULONG TotalCommittedPages;
    ULONG TotalCommitLimit;
    ULONG PeakCommitment;
    ULONG PageFaults;           // total soft or hard Page Faults since boot (wraps at 32-bits)
    ULONG Reserved[74]; // unknown
};
微软建议在获取SystemPerformanceInformation时用CryptGenRandom 代替NtQuerySystemInformation。 另,获取CPU数目可用GetSystemInfo代替, GetSystemTimes获取系统时间不知道是否适用? 以上拙见,请大家批评指正
gg606 2013-07-05
  • 打赏
  • 举报
回复
还有NtQuerySystemInformation返回的status是什么?是STATUS_INFO_LENGTH_MISMATCH吗? 还有不知道GetLastError管不管用
gg606 2013-07-05
  • 打赏
  • 举报
回复
如果不是权限的问题的话,那是不是结构数据对齐的问题呀?圆整因子太大?
lcmj520 2013-07-05
  • 打赏
  • 举报
回复
不是我故意贴代码,这些代码是我验证过的,对于64位2008R2不奏效的,是希望大家不要再贴这些代码了,这才是节省大家的时间。
stecdeng 2013-05-14
  • 打赏
  • 举报
回复
求代码有点诚意 会不会好些 几十行注释的代码 贴上来 不是浪费时间么?
  • 打赏
  • 举报
回复
我觉得找个牛人反汇编一下任务管理器应该就行了。。。
MoreWindows 2013-03-14
  • 打赏
  • 举报
回复
哇,这个帖子都二年了呀。 呵呵,我来做下,楼主关注我微博或博客,好了会发表在博客中的。 微博:http://weibo.com/MoreWindows 博客:http://blog.csdn.net/MoreWindows
zhangyihu321 2013-01-30
  • 打赏
  • 举报
回复
WMI 没有提供接口吗?
lcmj520 2013-01-28
  • 打赏
  • 举报
回复
都那么多年了,怎么还没见有些起色,还在跪求啊~
wacr_tony 2013-01-23
  • 打赏
  • 举报
回复
期待楼下给正解
wly11402 2013-01-17
  • 打赏
  • 举报
回复
同求!!!!!!!!!!!!!!!!!!!
feihuadao 2012-11-23
  • 打赏
  • 举报
回复
求解啊。。。
zhdj1109 2012-09-19
  • 打赏
  • 举报
回复
我也是,求解
jokers_i 2011-09-25
  • 打赏
  • 举报
回复
我也在找啊,不知道你找到没有
lcmj520 2011-09-18
  • 打赏
  • 举报
回复
谢谢LS的提醒,我继续找找~
cnyourdon 2011-09-01
  • 打赏
  • 举报
回复
好像说用perfmon你找一下相关资料
jbz001 2011-08-26
  • 打赏
  • 举报
回复
我也在找,几乎都是垃圾代码。
lcmj520 2011-04-11
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 isitnothing 的回复:]
用性能计数器编程。你可以到系统的管理工具里的性能计数器,可以看到有cpu使用率的计数器,编程获取计数器就可以了。
[/Quote]

能否给予一点代码呢?谢谢~
IsItNothing 2011-03-23
  • 打赏
  • 举报
回复
用性能计数器编程。你可以到系统的管理工具里的性能计数器,可以看到有cpu使用率的计数器,编程获取计数器就可以了。
加载更多回复(12)

2,641

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧