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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。