C++ 获取进程CPU占用率
核心代码
//时间转换 static__int64file_time_2_utc(constFILETIME*ftime) { LARGE_INTEGERli; li.LowPart=ftime->dwLowDateTime; li.HighPart=ftime->dwHighDateTime; returnli.QuadPart; } //获得CPU的核数 staticintget_processor_number() { SYSTEM_INFOinfo; GetSystemInfo(&info); return(int)info.dwNumberOfProcessors; } //获取进程CPU占用 intget_cpu_usage(intpid) { //cpu数量 staticintprocessor_count_=-1; //上一次的时间 static__int64last_time_=0; static__int64last_system_time_=0; FILETIMEnow; FILETIMEcreation_time; FILETIMEexit_time; FILETIMEkernel_time; FILETIMEuser_time; __int64system_time; __int64time; __int64system_time_delta; __int64time_delta; intcpu=-1; if(processor_count_==-1) { processor_count_=get_processor_number(); } GetSystemTimeAsFileTime(&now); HANDLEhProcess=OpenProcess(PROCESS_ALL_ACCESS,false,pid); if(!GetProcessTimes(hProcess,&creation_time,&exit_time,&kernel_time,&user_time)) { return-1; } system_time=(file_time_2_utc(&kernel_time)+file_time_2_utc(&user_time))/processor_count_; time=file_time_2_utc(&now); if((last_system_time_==0)||(last_time_==0)) { last_system_time_=system_time; last_time_=time; return-1; } system_time_delta=system_time-last_system_time_; time_delta=time-last_time_; if(time_delta==0) return-1; cpu=(int)((system_time_delta*100+time_delta/2)/time_delta); last_system_time_=system_time; last_time_=time; returncpu; }
以下是其它网友的补充
C++获取进程内存占用和CPU利用率等信息
1.获取内存占用信息
获取步骤:
(1)获取当前进程句柄使用GetCurrentProcess(),返回一个当前进程的句柄
(2)定义一个保存内存信息的结构体PROCESS_MEMORY_COUNTERSpmc;
结构体定义如下:
typedefstruct_PROCESS_MEMORY_COUNTERS{ DWORDcb;Sizeofthestructure,inbytes.//结构体大小 DWORDPageFaultCount;Numberofpagefaults.//缺页中断次数 SIZE_TPeakWorkingSetSize;Peakworkingsetsize,inbytes.//使用内存高峰 SIZE_TWorkingSetSize;Currentworkingsetsize,inbytes.//当前使用的内存 SIZE_TQuotaPeakPagedPoolUsage;Peakpagedpoolusage,inbytes.//使用页面缓存池高峰 SIZE_TQuotaPagedPoolUsage;Currentpagedpoolusage,inbytes.//使用页面缓存池 SIZE_TQuotaPeakNonPagedPoolUsage;Peaknonpagedpoolusage,inbytes.//使用非分页缓存池高峰 SIZE_TQuotaNonPagedPoolUsage;Currentnonpagedpoolusage,inbytes.//使用非分页缓存池 SIZE_TPagefileUsage;Currentspaceallocatedforthepagefile,inbytes.Thosepagesmayormaynotbeinmemory.//使用分页文件 SIZE_TPeakPagefileUsage;Peakspaceallocatedforthepagefile,inbytes.//使用分页文件高峰 }PROCESS_MEMORY_COUNTERS,*PPROCESS_MEMORY_COUNTERS;
(3)获取当前进程的内存信息,保存到结构体pmc中(第二个参数)使用GetProcessMemoryInfo()
API定义如下:
GetProcessMemoryInfo(
HANDLEProcess,获取内存使用情况的进程句柄。
PPROCESS_MEMORY_COUNTERSppsmemCounters,返回内存使用情况的结构
DWORDcb结构的大小
);DE
2.获取CPU利用率
获取步骤:
(1)获取当前进程句柄通过OpenProcess(),返回一个进程句柄
函数原型如下:
HANDLEOpenProcess( DWORDdwDesiredAccess,//渴望得到的访问权限(标志) BOOLbInheritHandle,//是否继承句柄 DWORDdwProcessId//进程标示符,可以通过getpid()获取当前进程ID );
(2)获取CPU使用时间通过调用GetProcessTimes()
函数原型如下:
BOOL WINAPI GetProcessTimes( __inHANDLEhProcess,需要获取相关时间的进程句柄 __outLPFILETIMElpCreationTime,进程的创建时间 __outLPFILETIMElpExitTime,进程的退出时间 __outLPFILETIMElpKernelTime,进程在内核模式下的所有时间 __outLPFILETIMElpUserTime进程在用户模式下的所有时间 );
CPU使用时间=(lpKernelTime+lpUserTime)/GetProcessNumber()(内核数)
内核数获取方法如下:
intGetProcessNumber() { SYSTEM_INFOinfo; GetSystemInfo(&info); return(int)info.dwNumberOfProcessors; }
(3)计算CPU利用率
CPU利用率=(现在的CPU占用时间-过去的CPU占用时间)/系统时间差
注:系统时间差可以通过GetSystemTimeAsFileTime()获取,然后在转换为int64类型即可,自定义转换方法如下:
__int64FileTimeToInt64(constFILETIME&time) { ULARGE_INTEGERtt;//64位无符号整型值 tt.LowPart=time.dwLowDateTime; tt.HighPart=time.dwHighDateTime; return(tt.QuadPart);//返回整型值 }
这篇文章就介绍到这了,需要的朋友可以参考一下。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。