C++取得プロセスCPU占有率
5110 ワード
コアコード
以下は他のネットユーザーの補足です.
C++プロセスメモリ占有率やCPU利用率などの情報を取得する
1.メモリ使用量情報の取得
取得手順:
(1)現在のプロセスハンドルを取得GetCurrentProcess()を使用して、現在のプロセスのハンドルを返します(2)メモリ情報を保存する構造体PROCESS_を定義します.MEMORY_COUNTERS pmc;
構造体の定義は次のとおりです.
(3)現在のプロセスのメモリ情報を取得し、構造体pmcに保存する(2番目のパラメータ)GetProcessMemoryInfo()を使用する
APIは以下のように定義される.
GetProcessMemoryInfo(HANDLE Process、メモリの使用状況を取得するプロセスハンドル.PPROCESS_MEMORY_COUNTERS ppsmemCounters、メモリの使用状況を返す構造DWORD cb構造の大きさ);DE
2.CPU利用率の取得
取得手順:
(1)現在のプロセスハンドルを取得OpenProcess()を介してプロセスハンドルを返す
関数のプロトタイプは次のとおりです.
(2)取得CPU使用時間GetProcessTimes()関数プロトタイプは以下の通りである.
CPU使用時間=(lpKernelTime+lpUserTime)/GetProcessNumber()(カーネル数)カーネル数取得方法は以下の通りである.
(3)CPU利用率の算出
CPU利用率=(現在のCPU占有時間-過去のCPU占有時間)/システム時間差
注意:システム時間差はGetSystemTimeAsFileTime()で取得できます.次にint 64タイプに変換します.カスタム変換方法は次のとおりです.
この文章はここまで紹介されていますので、必要な方は参考にしてください.
//
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); //
}
この文章はここまで紹介されていますので、必要な方は参考にしてください.