添加cpu占有率监控
parent
aa743a87b4
commit
223c303e1e
|
@ -0,0 +1,68 @@
|
|||
|
||||
#include "cpu_usage.h"
|
||||
|
||||
float CPUusage::get_cpu_usage()
|
||||
{
|
||||
FILETIME now;
|
||||
FILETIME creation_time;
|
||||
FILETIME exit_time;
|
||||
FILETIME kernel_time;
|
||||
FILETIME user_time;
|
||||
int64_t system_time;
|
||||
int64_t time;
|
||||
int64_t system_time_delta;
|
||||
int64_t time_delta;
|
||||
DWORD exitcode;
|
||||
float cpu = -1;
|
||||
|
||||
if (!_hProcess)
|
||||
return -1;
|
||||
GetSystemTimeAsFileTime(&now);
|
||||
//判断进程是否已经退出
|
||||
GetExitCodeProcess(_hProcess, &exitcode);
|
||||
if (exitcode != STILL_ACTIVE) {
|
||||
clear();
|
||||
return -1;
|
||||
}
|
||||
//计算占用CPU的百分比
|
||||
if (!GetProcessTimes(_hProcess, &creation_time, &exit_time, &kernel_time, &user_time))
|
||||
{
|
||||
clear();
|
||||
return -1;
|
||||
}
|
||||
system_time = (FileTime2UTC(&kernel_time) + FileTime2UTC(&user_time))
|
||||
/ _processor;
|
||||
time = FileTime2UTC(&now);
|
||||
//判断是否为首次计算
|
||||
if ((_last_system_time == 0) || (_last_time == 0))
|
||||
{
|
||||
_last_system_time = system_time;
|
||||
_last_time = time;
|
||||
return -2;
|
||||
}
|
||||
system_time_delta = system_time - _last_system_time;
|
||||
time_delta = time - _last_time;
|
||||
if (time_delta == 0) {
|
||||
return -1;
|
||||
}
|
||||
cpu = (float)system_time_delta * 100 / (float)time_delta;
|
||||
_last_system_time = system_time;
|
||||
_last_time = time;
|
||||
return cpu;
|
||||
}
|
||||
|
||||
CPUusage::uint64_t CPUusage::FileTime2UTC(const FILETIME* ftime)
|
||||
{
|
||||
LARGE_INTEGER li;
|
||||
|
||||
li.LowPart = ftime->dwLowDateTime;
|
||||
li.HighPart = ftime->dwHighDateTime;
|
||||
return li.QuadPart;
|
||||
}
|
||||
|
||||
int CPUusage::get_processor_number()
|
||||
{
|
||||
SYSTEM_INFO info;
|
||||
GetSystemInfo(&info);
|
||||
return info.dwNumberOfProcessors;
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
#include <Windows.h>
|
||||
//原理:调用GetProcessTimes(),并与上次调用得到的结果相减,即得到某段时间内CPU的使用时间
|
||||
//C++ 获取特定进程规定CPU使用率 原文:http://blog.csdn.net/liuqx97bb/article/details/52058657
|
||||
class CPUusage {
|
||||
private:
|
||||
typedef long long int64_t;
|
||||
typedef unsigned long long uint64_t;
|
||||
HANDLE _hProcess;
|
||||
int _processor; //cpu数量
|
||||
int64_t _last_time; //上一次的时间
|
||||
int64_t _last_system_time;
|
||||
|
||||
|
||||
// 时间转换
|
||||
uint64_t FileTime2UTC(const FILETIME* ftime);
|
||||
|
||||
// 获得CPU的核数
|
||||
int get_processor_number();
|
||||
|
||||
//初始化
|
||||
void init()
|
||||
{
|
||||
_last_system_time = 0;
|
||||
_last_time = 0;
|
||||
_hProcess = 0;
|
||||
}
|
||||
|
||||
//关闭进程句柄
|
||||
void clear()
|
||||
{
|
||||
if (_hProcess) {
|
||||
CloseHandle(_hProcess);
|
||||
_hProcess = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
CPUusage(DWORD ProcessID) {
|
||||
init();
|
||||
_processor = get_processor_number();
|
||||
setpid(ProcessID);
|
||||
}
|
||||
CPUusage() { init(); _processor = get_processor_number(); }
|
||||
~CPUusage() { clear(); }
|
||||
|
||||
//返回值为进程句柄,可判断OpenProcess是否成功
|
||||
HANDLE setpid(DWORD ProcessID) {
|
||||
clear(); //如果之前监视过另一个进程,就先关闭它的句柄
|
||||
init();
|
||||
return _hProcess= OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, ProcessID);
|
||||
}
|
||||
|
||||
//-1 即为失败或进程已退出; 如果成功,首次调用会返回-2(中途用setpid更改了PID后首次调用也会返回-2)
|
||||
float get_cpu_usage();
|
||||
};
|
||||
|
Loading…
Reference in New Issue