-

- 加为好友
- 发送私信
- 在线聊天
-
kkkgho
- 等级:

- 可用分等级:
- 总技术分:
- 总技术分排名:
- 结帖率:
|
| 发表于:2008-08-18 16:02:12 楼主 |
本文的目的是为了和大家讨论一个问题,同时给出一个根据进程ID,来返回该进程实时占用的CPU使用率的函数。希望大家在用这个函数的时候别忘记我的问题。 目前计算进程CPU占用率的方法主要有两种,一种是根据时间来计算,另一种根据注册表计算,我使用的是前者。前者方法原理:在一个特定时间段内计算特定进程的总时间和所有进程的总时间,它们的比值就是那个特定进程的确CPU占有率。 我写了一个函数(改写),以进程的ID作为参数,进程CPU占用率作为返回值,实时计算特定进程的CPU占用,测试正确。整个程序如下: 结构定义: typedef struct _THREAD_INFO { LARGE_INTEGER CreateTime; DWORD dwUnknown1; DWORD dwStartAddress; DWORD StartEIP; DWORD dwOwnerPID; DWORD dwThreadId; DWORD dwCurrentPriority; DWORD dwBasePriority; DWORD dwContextSwitches; DWORD Unknown; DWORD WaitReason; }THREADINFO, *PTHREADINFO; typedef struct _UNICODE_STRING { USHORT Length; USHORT MaxLength; PWSTR Buffer; } UNICODE_STRING; 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; 函数定义: int Button2Click(int id);//参数是进程ID 函数实体: int Button2Click(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; } 控制台调用: int main(void) { while(true) { int s = Button2Click(0);//在此把进程ID作为参数传入 printf("%d/n",s); Sleep(1000); } return 0; } /////////////////////////////// 以上代码运行非常正常 /////////////////////////////// 但我如何实时求出系统中运行的每个进程的CPU占用率,并列表显示出来?? 我遍历系统进程(for循环),然后把每个进程的ID作为参数传入,外部用定时器控制, 但是我得到的值都是错的,为什么??? 谁能搞定这个问题?? 问题:用此函数实时计算系统所有进程的CPU使用率,并在列表中显示出来??谢谢了,本人急用!!! |
|
|
|
40
修改
删除
举报
引用
回复
| |