溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++如何獲取特定進(jìn)程CPU使用率

發(fā)布時(shí)間:2021-05-22 11:17:05 來源:億速云 閱讀:652 作者:小新 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)C++如何獲取特定進(jìn)程CPU使用率,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

計(jì)算原理為調(diào)用GetProcessTimes(),與上次調(diào)用得到的結(jié)果相減得到CPU占用時(shí)間,再除以兩次調(diào)用的時(shí)間差,從而得到占用百分比。其中OpenProcess需要的權(quán)限為PROCESS_QUERY_LIMITED_INFORMATION,因此沒有管理員權(quán)限也可以使用。

C++如何獲取特定進(jìn)程CPU使用率

使用方法:

初始化:
可以在構(gòu)造函數(shù)中指定pid,也可以用setpid()指定pid。

查看CPU占用情況:

setpid()函數(shù):

指定一個(gè)需要監(jiān)視的進(jìn)程的PID。

get_cpu_usage()函數(shù):

查看CPU占用情況。打開進(jìn)程失敗,或者查看CPU占用情況失敗,以及被監(jiān)視的進(jìn)程退出后,都會(huì)返回-1。每次使用setpid()指定新的pid后首次調(diào)用都會(huì)返回-2。指定PID后從第二次調(diào)用開始,會(huì)返回一個(gè)0~100的float,為此次調(diào)用與上一次調(diào)用這段時(shí)間內(nèi)的CPU平均占用率。

代碼:

CPUusage類:(CPUusage.h)

#include <Windows.h>  
//原理:調(diào)用GetProcessTimes(),并與上次調(diào)用得到的結(jié)果相減,即得到某段時(shí)間內(nèi)CPU的使用時(shí)間 
//C++ 獲取特定進(jìn)程規(guī)定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數(shù)量  
  int64_t _last_time;     //上一次的時(shí)間  
  int64_t _last_system_time;  
 
 
  // 時(shí)間轉(zhuǎn)換  
  uint64_t file_time_2_utc(const FILETIME* ftime); 
 
  // 獲得CPU的核數(shù)  
  int get_processor_number(); 
 
  //初始化 
  void init() 
  { 
    _last_system_time = 0; 
    _last_time = 0; 
    _hProcess = 0; 
  } 
 
  //關(guān)閉進(jìn)程句柄 
  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(); } 
 
  //返回值為進(jìn)程句柄,可判斷OpenProcess是否成功 
  HANDLE setpid(DWORD ProcessID) {  
    clear();  //如果之前監(jiān)視過另一個(gè)進(jìn)程,就先關(guān)閉它的句柄 
    init();  
    return _hProcess= OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, ProcessID);  
  } 
 
  //-1 即為失敗或進(jìn)程已退出; 如果成功,首次調(diào)用會(huì)返回-2(中途用setpid更改了PID后首次調(diào)用也會(huì)返回-2) 
  float get_cpu_usage();  
};

實(shí)現(xiàn):(CPUusage.cpp)

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); 
 
  //判斷進(jìn)程是否已經(jīng)退出 
  GetExitCodeProcess(_hProcess, &exitcode);  
  if (exitcode != STILL_ACTIVE) { 
    clear(); 
    return -1; 
  } 
 
  //計(jì)算占用CPU的百分比 
  if (!GetProcessTimes(_hProcess, &creation_time, &exit_time, &kernel_time, &user_time)) 
  { 
    clear(); 
    return -1; 
  } 
  system_time = (file_time_2_utc(&kernel_time) + file_time_2_utc(&user_time)) 
    / _processor; 
  time = file_time_2_utc(&now); 
 
  //判斷是否為首次計(jì)算 
  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::file_time_2_utc(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; 
}

測(cè)試代碼:

#include "CPUusage.h" 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
 
  CPUusage usg(12316); 
  for (int i = 0; i < 10; i++) 
  { 
    float cpu = usg.get_cpu_usage(); 
    printf("Taskmgr.exe: %.2f%%\n", cpu); 
    Sleep(500); 
  } 
 
  usg.setpid(11084); 
  for (int i = 0; i < 10; i++) 
  { 
    float cpu = usg.get_cpu_usage(); 
    printf("devenv.exe: %.2f%%\n", cpu); 
    Sleep(1000); 
  } 
   
  return 0; 
}

關(guān)于“C++如何獲取特定進(jìn)程CPU使用率”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI