在最近做的一個(gè)項(xiàng)目中需要用到檢測(cè)進(jìn)程狀態(tài)的功能,在網(wǎng)上兜了半圈,普遍介紹的方法有三種:
1. 是利用GetExitCodeProcess(pi.hProcess,&dwExitCode);通過(guò)看dwExitCode返回值是不是
STILL_ACTIVE,依然活動(dòng),說(shuō)明存在;
2 .waitforsingleobject,通過(guò)超時(shí)來(lái)判斷,具體的實(shí)現(xiàn)方法可以去網(wǎng)上查,
3. openprocess,通過(guò)返回值來(lái)判斷,如果返回值為NULL則表示進(jìn)程已經(jīng)打開,否則沒(méi)有打開。
上面3個(gè)方法別人都說(shuō)行,也有人說(shuō)有局限性,就拿openprocess來(lái)說(shuō)吧,自己在測(cè)試是發(fā)現(xiàn)線程關(guān)掉了但是返回值還是NULL,郁悶啊~~,沒(méi)辦法只能用最土的辦法來(lái)解決這個(gè)問(wèn)題,
4. load系統(tǒng)的進(jìn)程表,看進(jìn)程id是不是匹配,匹配則表示正在運(yùn)行,否則就已經(jīng)掛了,代碼如下:
#include <Tlhelp32.h>
//如果有運(yùn)行,返回進(jìn)程的true,沒(méi)運(yùn)行返回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;
}
}
}