C++取得プロセスCPU占有率

5110 ワード

コアコード

//     
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に保存する(2番目のパラメータ)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()で取得できます.次にint 64タイプに変換します.カスタム変換方法は次のとおりです.

__int64 FileTimeToInt64(const FILETIME& time) 
{ 

  ULARGE_INTEGER tt; //64       
  tt.LowPart = time.dwLowDateTime; 
  tt.HighPart = time.dwHighDateTime;
  return(tt.QuadPart); //     

}

この文章はここまで紹介されていますので、必要な方は参考にしてください.