C++ 获取进程CPU占用率

核心代码

// 时间转换
static __int64 file_time_2_utc(const FILETIME* ftime)
{
  LARGE_INTEGER li;

  li.LowPart = ftime->dwLowDateTime;
  li.HighPart = ftime->dwHighDateTime;
  return li.QuadPart;
}

// 获得CPU的核数
static int get_processor_number()
{
  SYSTEM_INFO info;
  GetSystemInfo(&info);
  return (int)info.dwNumberOfProcessors;
}
// 获取进程CPU占用
int get_cpu_usage(int pid)
{
  //cpu数量
  static int processor_count_ = -1;
  //上一次的时间
  static __int64 last_time_ = 0;
  static __int64 last_system_time_ = 0;

  FILETIME now;
  FILETIME creation_time;
  FILETIME exit_time;
  FILETIME kernel_time;
  FILETIME user_time;
  __int64 system_time;
  __int64 time;
  __int64 system_time_delta;
  __int64 time_delta;

  int cpu = -1;

  if(processor_count_ == -1)
  {
    processor_count_ = get_processor_number();
  }

  GetSystemTimeAsFileTime(&now);

  HANDLE hProcess = 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;
  return cpu;
}

以下是其它网友的补充

C++ 获取进程内存占用和CPU利用率等信息

1.获取内存占用信息

获取步骤:

(1)获取当前进程句柄 使用GetCurrentProcess(),返回一个当前进程的句柄
(2)定义一个保存内存信息的结构体 PROCESS_MEMORY_COUNTERS pmc;

结构体定义如下:

typedef struct _PROCESS_MEMORY_COUNTERS {
DWORD cb;                                                Size of the structure, in bytes.//结构体大小
DWORD PageFaultCount;                               Number of page faults. // 缺页中断次数
SIZE_T PeakWorkingSetSize;                             Peak working set size, in bytes. // 使用内存高峰
SIZE_T WorkingSetSize;                               Current working set size, in bytes. // 当前使用的内存
SIZE_T QuotaPeakPagedPoolUsage;                          Peak paged pool usage, in bytes. // 使用页面缓存池高峰
SIZE_T QuotaPagedPoolUsage;                             Current paged pool usage, in bytes.// 使用页面缓存池
SIZE_T QuotaPeakNonPagedPoolUsage;                         Peak nonpaged pool usage, in bytes.// 使用非分页缓存池高峰
SIZE_T QuotaNonPagedPoolUsage;                          Current nonpaged pool usage, in bytes.// 使用非分页缓存池
SIZE_T PagefileUsage;                              Current space allocated for the pagefile, in bytes.Those pages may or may not be in memory.// 使用分页文件
SIZE_T PeakPagefileUsage;                             Peak space allocated for the pagefile, in bytes.// 使用分页文件高峰
} PROCESS_MEMORY_COUNTERS, *PPROCESS_MEMORY_COUNTERS;

(3)获取当前进程的内存信息,保存到结构体pmc中(第二个参数) 使用GetProcessMemoryInfo()

API定义如下:

GetProcessMemoryInfo(
HANDLE Process,               获取内存使用情况的进程句柄。
PPROCESS_MEMORY_COUNTERS ppsmemCounters,            返回内存使用情况的结构
DWORD cb                                结构的大小
);DE

2.获取CPU利用率

获取步骤:

(1)获取当前进程句柄 通过OpenProcess(),返回一个进程句柄

函数原型如下:

HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符,可以通过getpid()获取当前进程ID
);

(2)获取CPU使用时间 通过调用GetProcessTimes()
函数原型如下:

BOOL
WINAPI
GetProcessTimes(
__in HANDLE hProcess,                    需要获取相关时间的进程句柄
__out LPFILETIME lpCreationTime,          进程的创建时间
__out LPFILETIME lpExitTime,            进程的退出时间
__out LPFILETIME lpKernelTime,           进程在内核模式下的所有时间
__out LPFILETIME lpUserTime            进程在用户模式下的所有时间
);

CPU使用时间=(lpKernelTime+lpUserTime)/GetProcessNumber()(内核数)
内核数获取方法如下:

int GetProcessNumber()
{ 

  SYSTEM_INFO info;
  GetSystemInfo(&info);
  return (int)info.dwNumberOfProcessors;
} 

(3)计算CPU利用率

CPU利用率=(现在的CPU占用时间-过去的CPU占用时间)/系统时间差

注:系统时间差可以通过GetSystemTimeAsFileTime()获取,然后在转换为int64类型即可,自定义转换方法如下:

__int64 FileTimeToInt64(const FILETIME& time)
{ 

  ULARGE_INTEGER tt; //64位无符号整型值
  tt.LowPart = time.dwLowDateTime;
  tt.HighPart = time.dwHighDateTime;
  return(tt.QuadPart); //返回整型值

}

这篇文章就介绍到这了,需要的朋友可以参考一下。

(0)

相关推荐

  • c++文件监控之FileSystemWatcher

    具体代码如下: #using <System.dll> #include <iostream> using namespace std; using namespace System; using namespace System::IO; using namespace System::Security::Permissions; public ref class Watcher { private: // Define the event handlers. static vo

  • C++中rapidjson将map转为json的方法

    rapidjson将map转为json------人生苦短,我用rapidjson 直接撸代码: #include <iostream> #include <map> // 请自己下载开源的rapidjson #include "rapidjson/prettywriter.h" #include "rapidjson/rapidjson.h" #include "rapidjson/document.h" #includ

  • C++获取MD5算法实现代码

    这个是网上扒下来的 作者已经无法知道是谁了 MD5.h #ifndef MD5_H #define MD5_H #include <string> #include <fstream> /* Type define */ typedef unsigned char byte; typedef unsigned int uint32; typedef unsigned int uint4; using std::string; using std::ifstream; /* MD5

  • 详解C++中虚析构函数的作用及其原理分析

    C++中的虚析构函数到底什么时候有用的,什么作用呢. 一.虚析构函数的作用 总的来说虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的.也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内存泄露的. 我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数.可是,为什么要这样做呢?下面用一个小例子来说明: #include<iostream> using namespace std; class Cl

  • vc++ 监控指定路径下文件变化实现代码

    参考MSDN文档 https://docs.microsoft.com/zh-cn/windows/desktop/api/winbase/nf-winbase-readdirectorychangesw https://docs.microsoft.com/zh-cn/windows/desktop/api/winnt/ns-winnt-_file_notify_information 具体看代码 # include < iostream > # include < windows.h

  • C++中rapidjson将嵌套map转为嵌套json的讲解

    rapidjson将嵌套map转为嵌套json------人生苦短,我用rapidjson 看代码: #include <iostream> #include <map> // 请自己下载开源的rapidjson #include "rapidjson/prettywriter.h" #include "rapidjson/rapidjson.h" #include "rapidjson/document.h" #incl

  • 用C/C++代码检测ip能否ping通(配合awk和system可以做到批量检测)

    遇到一个小需求, 快速搞定. 来看看用C/C++代码检测ip能否ping通: #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> using namespace std; string getCmdResult(const string &strCmd) // 这个是获取命令执行的结果, 类似于

  • C++类中变量也可以是引用的代码实例

    C++类中变量也可以是引用哈------要用初始化列表来初始化(因为C++引用一旦绑定,就无法更换,有点类似const) #include <iostream> using namespace std; class A { public: int &x; int &y; A(int &tmpX, int &tmpY):x(tmpX), y(tmpY){} }; int main() { int tmpX = 1; int tmpY = 2; A a(tmpX,

  • C++中rapidjson组装继续简化的方法

    rapidjson组装继续简化------人生苦短,我用rapidjson 看最简单的: #include <iostream> #include <stdio.h> #include<unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include<sstream> // 请自己下载开源的rapidjson #includ

  • C++中rapidjson组装map和数组array的代码示例

    rapidjson组装map和数组array的代码示例 直接上码: #include <iostream> #include <map> // 请自己下载开源的rapidjson #include "rapidjson/prettywriter.h" #include "rapidjson/rapidjson.h" #include "rapidjson/document.h" #include "rapidjs

随机推荐