请问在VC中如何实时获取CPU的使用率?
大家好,我是初学者,在网上找了很多代码,就是想做一个和任务管理器一样的东西,可以实时获取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");
}
*/