命令行参数:此exe名 应用程序名(如:360se.exe)
//#include
#include
#include
#include
#include
#include
#include
#define MY_PROCESS_ERROR(Condition) do{ if (!(Condition)) goto Exit0; } while (false)
static DWORD g_sdwTickCountOld = 0; // 上一次的tick计数
static LARGE_INTEGER g_slgProcessTimeOld; // 保存进程上一次的时间占用
static DWORD g_sdwProcessorCoreNum = 0; // 处理器核心数
static HANDLE g_shExitEvent = NULL; // 线程退出控制
typedef struct _TARGET_PROCESS
{
DWORD dwProcessId; // 进程ID
}TARGET_PROCESS, *PTARGET_PROCESS;
HRESULT FindFirstProcessIdByName(const TCHAR* cpszExeFileName, DWORD &dwPID)
{
HRESULT hr = E_FAIL;
PROCESSENTRY32 pe = { 0 };
HANDLE hSnapshot = NULL;
if (NULL == cpszExeFileName)
{
hr = HRESULT_FROM_WIN32(ERROR_BAD_ARGUMENTS);
goto Exit0;
}
pe.dwSize = sizeof(PROCESSENTRY32);
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot)
{
hr = HRESULT_FROM_WIN32(GetLastError());
goto Exit0;
}
if (FALSE == Process32First(hSnapshot, &pe))
{
hr = HRESULT_FROM_WIN32(ERROR_NO_MORE_FILES);
goto Exit0;
}
hr = S_FALSE;
do
{
if (0 == _tcsicmp(cpszExeFileName, pe.szExeFile))
{
dwPID = pe.th32ProcessID;
hr = S_OK;
break;
}
}while(Process32Next(hSnapshot, &pe));
Exit0:
if(hSnapshot)
{
CloseHandle(hSnapshot);
hSnapshot = NULL;
}
return hr;
}
int GetProcessCpuPercent(const HANDLE hProcess, const DWORD dwElepsedTime)
{
int nProcCpuPercent = 0;
BOOL bRetCode = FALSE;
FILETIME CreateTime, ExitTime, KernelTime,UserTime;
LARGE_INTEGER lgKernelTime;
LARGE_INTEGER lgUserTime;
LARGE_INTEGER lgCurTime;
bRetCode = GetProcessTimes(hProcess, &CreateTime, &ExitTime, &KernelTime, &UserTime);
if (bRetCode)
{
lgKernelTime.HighPart = KernelTime.dwHighDateTime;
lgKernelTime.LowPart = KernelTime.dwLowDateTime;
lgUserTime.HighPart = UserTime.dwHighDateTime;
lgUserTime.LowPart = UserTime.dwLowDateTime;
lgCurTime.QuadPart = (lgKernelTime.QuadPart + lgUserTime.QuadPart) / 10000;
nProcCpuPercent = (int)((lgCurTime.QuadPart - g_slgProcessTimeOld.QuadPart) * 100 / dwElepsedTime);
g_slgProcessTimeOld = lgCurTime;
nProcCpuPercent = nProcCpuPercent / g_sdwProcessorCoreNum;
}
else
{
nProcCpuPercent = -1;
}
return nProcCpuPercent;
}
unsigned __stdcall WorkerThread(void *pArg)
{
HRESULT hr = E_FAIL;
HANDLE hProcess = NULL;
DWORD dwProcessId = 0;
DWORD dwRetVal = 0;
DWORD dwCurrentTickCount = 0;
DWORD dwElapsedTime = 0;
int nProcessCpuPercent = 0;
TARGET_PROCESS *pTargetProcess = (TARGET_PROCESS *)pArg;
dwProcessId = pTargetProcess->dwProcessId;
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION , FALSE, dwProcessId);
MY_PROCESS_ERROR(hProcess);
//#############################
DWORD dwAverageCpuOwnerPercent = 0;
DWORD dwTotalCpuOwnerPercent = 0;
DWORD dwTimes = 0;
DWORD dwMaxCpuOwnerPercent = 0;
DWORD dwMinCpuOwnerPercent = 100;
//############################
do
{
dwRetVal = WaitForSingleObject(g_shExitEvent, 1000);
if (WAIT_OBJECT_0 == dwRetVal ||
WAIT_FAILED == dwRetVal
)
{
break;
}
dwCurrentTickCount = GetTickCount();
dwElapsedTime = dwCurrentTickCount - g_sdwTickCountOld;
g_sdwTickCountOld = dwCurrentTickCount;
nProcessCpuPercent = GetProcessCpuPercent(hProcess, dwElapsedTime);
if(dwMaxCpuOwnerPercent < nProcessCpuPercent)
{
dwMaxCpuOwnerPercent = nProcessCpuPercent;
}
if(dwMinCpuOwnerPercent > nProcessCpuPercent)
{
dwMinCpuOwnerPercent = nProcessCpuPercent;
}
dwTotalCpuOwnerPercent += nProcessCpuPercent;
dwTimes++;
dwAverageCpuOwnerPercent = dwTotalCpuOwnerPercent / dwTimes;
wprintf(L"cpu:- avg- max-\n", nProcessCpuPercent, dwAverageCpuOwnerPercent,dwMaxCpuOwnerPercent);
//wprintf(L"cpu:%d\n", nProcessCpuPercent);
} while (1);
Exit0:
if (hProcess)
{
CloseHandle(hProcess);
hProcess = NULL;
}
return 0;
}
int main(int argc, _TCHAR* argv[])
{
HRESULT hr = E_FAIL;
HANDLE hThread = NULL;
unsigned int uiTid = 0;
SYSTEM_INFO sysInfo = { 0 };
TARGET_PROCESS struTargetProcess;
if (argc > 1)
{
hr = FindFirstProcessIdByName(argv[1], struTargetProcess.dwProcessId);
if (S_OK != hr)
{
_tprintf(_T("Can't find process \'%s\' ret=0x%X\n"), argv[1], hr);
goto Exit0;
}
GetSystemInfo(&sysInfo);
g_sdwProcessorCoreNum = sysInfo.dwNumberOfProcessors;
g_shExitEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
MY_PROCESS_ERROR(g_shExitEvent);
hThread = (HANDLE)_beginthreadex(NULL, 0, WorkerThread, &struTargetProcess, 0, &uiTid);
MY_PROCESS_ERROR(hThread);
_getch();
SetEvent(g_shExitEvent);
WaitForSingleObject(hThread, INFINITE);
}
else
{
_tprintf(_T("Please input a process name.\n"));
}
Exit0:
if (hThread)
{
CloseHandle(hThread);
hThread = NULL;
}
if (g_shExitEvent)
{
CloseHandle(g_shExitEvent);
g_shExitEvent = NULL;
}
return 0;
}