2012-10-15 11 views
6

Jaka jest korzyść z używania WaitForSingleObject tutaj, w przeciwieństwie do nieużywania go? Pierwszy blok kodu pochodzi z previous answer. Drugi blok to sposób, w jaki to robię.Korzyści z używania obiektu WaitForSingleObject podczas sprawdzania identyfikatora procesu

BOOL IsProcessRunning(DWORD pid) 
{ 
    HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid); 
    DWORD ret = WaitForSingleObject(process, 0); 
    CloseHandle(process); 
    return (ret == WAIT_TIMEOUT); 
} 

vs

BOOL IsProcessRunning(DWORD pid) 
{ 
    HANDLE process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid); 
    const bool exists = (process != NULL); 
    CloseHandle(process); 
    return exists; 
} 

Wydaje się, używając SYNCHRONIZE wymaga wyższych uprawnień i chcę tylko sprawdzić PID dla bieżącego użytkownika.

+1

Aby dodać niektóre prace porównawcze - możesz porównać "GetExitCodeProcess" z 'WaitForSingleObject', aby określić stan zakończenia procesu. –

Odpowiedz

8

Po zakończeniu procesu przestaje działać, ale nie przestaje istnieć, dopóki ostatni uchwyt do niego nie zostanie zamknięty. Pierwsze rozwiązanie rozróżnia te dwa stany (nadal działające lub uruchomione). Oczywiście odpowiedź może być przestarzała do czasu, kiedy powróci.

Jeśli nie potrzebujesz tego rozróżnienia, twoje podejście jest w porządku (chociaż nazwałbym tę funkcję czymś takim jak DoesProcessExist).

+1

Dodałbym również identyfikator procesu * teoretycznie * może być ponownie użyty. Tak więc za każdym razem nie jest dobrym pomysłem otwarcie procesu przez jego identyfikator. Lepiej otwórz jego uchwyt raz (lub zapisz go, jeśli został utworzony lub uzyskany od innej firmy). – valdo

-1

WaitForSingleObject będzie czekać, aż proces zakończy się/zakończy. Tylko wtedy powróci.

+3

Nie z limitem czasu wynoszącym 0. –

+0

@AdrianMcCarthy Masz rację - nie widzę 0. – user93353

+0

Limit czasu zero jest częścią genialności (mam nadzieję, że pisałem to dobrze), to albo się wyłączy natychmiast (= proces działa) lub fail (= proces zombie). – Damon

1

Implementacja IsProcessRunning może również korzystać z API Win32 GetExitCodeProcess.

+0

Co jeśli proces celowo zwraca 259 ('STILL_ACTIVE') jako swój kod wyjścia? – zett42

Powiązane problemy