天天看點

c語言cpu使用率,實時擷取CPU使用率的類【轉】

//=========================================================

//

// Copyright (c) 2000-2004  iWise Technologies,Co. Ltd.

// All Rights Reserved.

//

// Product: iW988

// file: CpuUsage.h

// Created: 天衣有縫

//

// Des cription:

//     ValueAdded main program for iW988.

//                   Cont act:

//

//=========================================================

#pragmaonce#defineSystemBasicInformation0#defineSystemPerformanceInformation2#defineSystemTimeInformation3#defineLi2Double(x) ((double)((x).HighPart) *4.294967296E9+(double)((x).LowPart))classCCpuUsage

{public:CCpuUsage();

~CCpuUsage() ;public:

intGetCpuUsage();//得到系統cpu使用率

intSetRefreshInterval(intmilli_sec);//定時重新整理間隔

private:

//類型定義

typedefLONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);typedefstruct{

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;typedefstruct{

LARGE_INTEGER liIdleTime;

DWORD dwSpare[76];

} SYSTEM_PERFORMANCE_INFORMATION;typedefstruct{

LARGE_INTEGER liKeBootTime;

LARGE_INTEGER liKeSystemTime;

LARGE_INTEGER liExpTimeZoneBias;

ULONG uCurrentTimeZoneId;

DWORD dwReserved;

} SYSTEM_TIME_INFORMATION;//變量定義SYSTEM_PERFO RMANCE_INFORMATION SysPerfInfo;

SYSTEM_TIME_ INFORMATION SysTimeInfo;

SYSTEM_BASIC _INFORMATION SysBaseInfo;doubledbIdleTime;doubledbSystemTime;

LONG status;

LARGE_INTEGE R liOldIdleTime;

LARGE_INTEGE R liOldSystemTime;

PROCNTQSI NtQuerySystemInformation;intm_nCpuUsage;//定時HWND m_hWnd;intm_nRefreshInterval;//預設為1000毫秒

intm_nTimerID;private:

staticvoidCalcCpuUsage(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);intOnTimer();

};inlineCCpuUsage::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(ntdll) ,NtQuerySystemInformation);if(!NtQuerySystemInformation)return;// get number of processors in the systemstatus=NtQuerySystemInformation(SystemBasicInformation,&SysBase Info,sizeof(SysBaseInfo),NULL);if(status!=NO_ERROR)return;// create control for timerm_hWnd=::CreateWindow(static,,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);

}inlineCCpuUsage::~CCpuUsage()

{

KillTimer(m_hWnd , m_nTimerID);

DestroyWindow(m_hWnd);

}inlinevoidCCpuUsage::CalcCpuUsage(

HWND hwnd,

UINT uMsg,

UINT _PTR idEvent,

DWORD dwTime

)

{

CCpuUsage* pCpu=(CCpuUsage*)::GetWindowLong(hwnd , GWL_USERDATA);if( pCpu )

{

pCpu->OnTimer();

}

}inlineintCCpuUsage::OnTimer()

{

status=NtQuerySystemInformation(SystemTimeInformation,&SysTimeI nfo,sizeof(SysTimeInfo),0);if(status!=NO_ERROR)return0;// get new CPUs idle timestatus=NtQuerySystemInformation(SystemPerformanceInformation,&S ysPerfInfo,sizeof(SysPerfInfo),NULL);if(status!=NO_ERROR)return0;// if its a first call – skip it

if(liOldIdleTime.QuadPart!=0)

{// CurrentValue = NewValue – OldValuedbIdleTime=Li2Double(SysPerfInfo.liIdleTime)-Li2Double(liOldIdleTime);

dbSystemTime=Li2Double(SysTimeInfo.liKeSystemTime)-Li2Double(liOldSystemTime);// CurrentCpuIdle = IdleTime / SystemTimedbIdleTime=dbIdleTime / dbSystemTime;// CurrentCpuUsage% = 100 – (CurrentCpuIdle * 100) / NumberOfProcessorsdbIdleTime=100.0-dbIdleTime *100.0/ (double)SysBaseInfo.bKeNumberProcessors+0.5;

m_nCpuUsage=(UINT)dbIdleTime;

}// store new CPUs idle and system timeliOldIdleTime=SysPerfInfo.liIdleTime;

liOldSystemTime=SysTimeInfo.liKeSystemTime;// wait one second

return0;

}inlineintCCpuUsage::GetCpuUsage()

{returnm_nCpuUsage;

}inlineintCCpuUsage::SetRefreshInterval(intmilli_sec)

{

m_nRefreshInterval=milli_sec;if( m_hWnd )

{

TIMERPROC tp=(TIMERPROC)CalcCpuUsage;

SetTimer(m_h Wnd, m_nTimerID, m_nRefreshInterval ,tp);

}return0;

}