转自这篇博客:https://www.cnblogs.com/zengqh/archive/2012/05/02/2479813.html
稍作修改,每隔一定时间统计某个进程的cpu占用率并打印,程序可在VS2013上直接运行。
/* percent = (user_time_diff + kernel_time_diff) * 100 / (cpu_num * system_time_diff) */
#include<windows.h>
#include<stdio.h>
#include <pdh.h>
#include <Tlhelp32.h>
#define PROCESS_NAME "VPN.exe"
#define TIME 2000
int main()
{
// Find the specified Process
HANDLE hProcess = NULL;
PROCESSENTRY32 pe = { sizeof(pe) };
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
BOOL suc = Process32First(hSnapShot, &pe);
while (suc)
{
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, false, pe.th32ProcessID);
if (hProcess != NULL)
{
if (strcmp(pe.szExeFile, PROCESS_NAME) == 0)
{
break;
}
}
CloseHandle(hProcess);
suc = Process32Next(hSnapShot, &pe);
}
// Got it
if (suc)
{
ULARGE_INTEGER ulLastSysTime, ulCurSysTime;
ULARGE_INTEGER ulStart, ulEnd,
ulLastProcKernelTime, ulLastProcUserTime,
ulCurProcKernelTime, ulCurProcUserTime;
ULARGE_INTEGER ulKernelTimeUsed, ulUserTimeUsed, ulSysTimePast;
SYSTEM_INFO si = { 0 };
int iCpuUsage = 0;
GetSystemInfo(&si);
GetSystemTimeAsFileTime((PFILETIME)&ulLastSysTime);
GetProcessTimes(hProcess, (PFILETIME)&ulStart, (PFILETIME)&ulEnd,
(PFILETIME)&ulLastProcKernelTime, (PFILETIME)&ulLastProcUserTime);
while (1)
{
Sleep(TIME);
GetProcessTimes(hProcess, (PFILETIME)&ulStart, (PFILETIME)&ulEnd,
(PFILETIME)&ulCurProcKernelTime, (PFILETIME)&ulCurProcUserTime);
GetSystemTimeAsFileTime((PFILETIME)&ulCurSysTime);
ulKernelTimeUsed.QuadPart = ulCurProcKernelTime.QuadPart - ulLastProcKernelTime.QuadPart;
ulUserTimeUsed.QuadPart = ulCurProcUserTime.QuadPart - ulLastProcUserTime.QuadPart;
ulSysTimePast.QuadPart = ulCurSysTime.QuadPart - ulLastSysTime.QuadPart;
iCpuUsage = (
(ulKernelTimeUsed.QuadPart + ulUserTimeUsed.QuadPart) * 100 /
(float)(si.dwNumberOfProcessors*ulSysTimePast.QuadPart)) + 0.5f
;
printf("\rThe Process use %3d%%", iCpuUsage);
ulLastSysTime = ulCurSysTime;
ulLastProcKernelTime = ulCurProcKernelTime;
ulLastProcUserTime = ulCurProcUserTime;
}
}
system("pause");
return 0;
}