CPU使用率计算

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值