CPU使用率计算
来源:互联网 发布:linux中fork函数 编辑:程序博客网 时间:2024/04/28 10:19
int CTestCPUDlg::CPUUsage(int id){int cpuusage; PVOID pProcInfo = NULL; DWORD dwInfoSize = 0x20000; PPROCESSINFO pProcessInfo; DWORD dwWorkingSet; long ( __stdcall *NtQuerySystemInformation )( DWORD, PVOID, DWORD, DWORD ); static __int64 LastTotalProcessCPUUsage = 0; static __int64 LastCurrentProcessCPUUsage = 0; int CurrentDelta; int TotalDelta; __int64 TotalProcessCPUUsage = 0; __int64 CurrentProcessCPUUsage = 0; ///////////////////////////////// pProcInfo = (PVOID)(new byte[dwInfoSize]); NtQuerySystemInformation = (long(__stdcall*)(DWORD,PVOID,DWORD,DWORD))GetProcAddress( GetModuleHandle( "ntdll.dll" ),"NtQuerySystemInformation" ); NtQuerySystemInformation(5,pProcInfo,dwInfoSize,0); pProcessInfo = (PPROCESSINFO)pProcInfo; do { TotalProcessCPUUsage += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart; if(pProcessInfo->dwProcessID == id) { dwWorkingSet = pProcessInfo->dwWorkingSet; CurrentProcessCPUUsage += (__int64)pProcessInfo->KernelTime.QuadPart + (__int64)pProcessInfo->UserTime.QuadPart; } ///////// if(pProcessInfo->dwOffset == 0) { break; } pProcessInfo = (PPROCESSINFO)((byte*)pProcessInfo + pProcessInfo->dwOffset); }while(true); TotalDelta = TotalProcessCPUUsage - LastTotalProcessCPUUsage; CurrentDelta = CurrentProcessCPUUsage - LastCurrentProcessCPUUsage; if(TotalDelta != 0) cpuusage = 100 * CurrentDelta / TotalDelta; //this->Caption = "CPU = " + IntToStr(100 * CurrentDelta / TotalDelta) + //"Memory = "+ IntToStr(dwWorkingSet / 1024) " K"; LastTotalProcessCPUUsage = TotalProcessCPUUsage; LastCurrentProcessCPUUsage = CurrentProcessCPUUsage; delete[] pProcInfo; return cpuusage; }
typedef struct _PROCESS_INFO { DWORD dwOffset; DWORD dwThreadsCount; DWORD dwUnused1[6]; LARGE_INTEGER CreateTime; LARGE_INTEGER UserTime; LARGE_INTEGER KernelTime; UNICODE_STRING ProcessName; DWORD dwBasePriority; DWORD dwProcessID; DWORD dwParentProcessId; DWORD dwHandleCount; DWORD dwUnused3[2]; DWORD dwVirtualBytesPeak; DWORD dwVirtualBytes; ULONG dwPageFaults; DWORD dwWorkingSetPeak; DWORD dwWorkingSet; DWORD dwQuotaPeakPagedPoolUsage; DWORD dwQuotaPagedPoolUsage;DWORD dwQuotaPeakNonPagedPoolUsage; DWORD dwQuotaNonPagedPoolUsage;DWORD dwPageFileUsage; DWORD dwPageFileUsagePeak; DWORD dCommitCharge; THREADINFO ThreadSysInfo[1]; } PROCESSINFO, *PPROCESSINFO;