Get the class of CPU usage in real time [original]

xiaoxiao2021-03-06  51

Description: 1. Use the Timer timer internally, automatically refresh, so that the external use is very clear;

The main program must have a message loop / / ============================================ =============== //// copyright (c) 2000-2004 iWise Technologies, Co. Ltd./////////////////////// CPUUSAGE.H // Created: Tianda Sewed // // Description: // ValueAdded Main Program for IW98. // Contact: // Waterpub@mail.9cbs.net/ / / ======== ================================================== # pragma once #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 (); // Get system CPU utilization int setRefreshinterval (int Milli_sec); // Time Refresh Interval PRIVATE: // Type Definition 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 ; // variable definition 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; // Timing HWND m_hWnd; int m_nRefreshInterval; // defaults to 1000 milliseconds in t 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 ( "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 ("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);} 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, sizeo f (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 = dbIdleTime / dbSystemTime; // CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors Dbidletime = 100.0 - DBIDLETIME * 100.0 / (double) sysbaseinfo.bkenumberprocessors 0.5;

转载请注明原文地址:https://www.9cbs.com/read-81997.html

New Post(0)