在最近做的一個項目中需要用到檢測進程狀態的功能,在網上兜了半圈,普遍介紹的方法有三種:
1. 是利用GetExitCodeProcess(pi.hProcess,&dwExitCode);通過看dwExitCode返回值是不是
STILL_ACTIVE,依然活動,說明存在;
2 .waitforsingleobject,通過超時來判斷,具體的實現方法可以去網上查,
3. openprocess,通過返回值來判斷,如果返回值為NULL則表示進程已經打開,否則沒有打開。
上面3個方法別人都說行,也有人說有局限性,就拿openprocess來說吧,自己在測試是發現線程關掉了但是返回值還是NULL,郁悶啊~~,沒辦法只能用最土的辦法來解決這個問題,
4. load系統的進程表,看進程id是不是匹配,匹配則表示正在運行,否則就已經掛了,代碼如下:
#include <Tlhelp32.h>
//如果有運行,返回進程的true,沒運行返回false
bool ProcessExist(DWORD process_id)
{
PROCESSENTRY32 pe;
DWORD id = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize = sizeof(PROCESSENTRY32);
if( !Process32First(hSnapshot,&pe) )
{
CloseHandle(hSnapshot);
return false;
}
while(1)
{
pe.dwSize = sizeof(PROCESSENTRY32);
if( Process32Next(hSnapshot,&pe)==FALSE )
{
CloseHandle(hSnapshot);
return false;
}
if(process_id == pe.th32ProcessID)
{
CloseHandle(hSnapshot);
return true;
}
}
}