//=========================================================
//
// 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;
}