2012-10-15 3 views
6

WaitForSingleObject을 사용하지 않는 것에 비해 이점은 무엇입니까? 코드의 첫 번째 블록은 previous answer입니다. 두 번째 블록은 내가 어떻게하고 있는지를 보여줍니다.프로세스 ID를 확인할 때 WaitForSingleObject를 사용할 때의 이점

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

그것은 SYNCHRONIZE를 사용하는 것 같아

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

대 더 높은 권한이 필요하고 나는 현재 사용자의 PID를 확인합니다.

+1

비교 작업을 추가하려면 프로세스 완료 상태를 결정할 때'GetExitCodeProcess'와'WaitForSingleObject'를 비교할 수 있습니다. –

답변

8

프로세스가 완료되면 실행이 중지되지만 마지막 핸들이 닫힐 때까지는 존재하지 않습니다. 첫 번째 솔루션은 두 가지 상태 (여전히 실행 중이거나 실행중인 상태)를 구별합니다. 물론 답은 돌아올 때 쓸모가 없어 질 수 있습니다.

그런 구분이 필요하지 않은 경우 접근 방법은 괜찮습니다 (DoesProcessExist와 같은 함수의 이름을 지정하겠습니다).

+1

또한 이론적으로 프로세스 ID *를 추가하여 재사용 할 수 있습니다. 일반적으로 매번 ID로 프로세스를 여는 것이 좋지 않습니다. 핸들을 한 번 더 열어보십시오 (또는 만든 경우 저장하거나 일부 타사에서 가져옴). – valdo

-1

WaitForSingleObject는 프로세스가 완료되거나 종료 될 때까지 대기합니다. 그래야만 다시 돌아올 것입니다.

+3

타임 아웃이 0이 아님 –

+0

@AdrianMcCarthy 맞습니다 - 나는 0을 보지 못했습니다. – user93353

+0

제로 타임 아웃은 현세의 일부입니다 (바르게 말해서 그 철자가 맞았습니다), 즉시 종료됩니다 (= 프로세스 실행 중) 또는 실패 (= 좀비 프로세스). – Damon

1

IsProcessRunning의 구현은 GetExitCodeProcess Win32 API를 사용할 수도 있습니다.

+0

프로세스가 의도적으로 종료 코드로 259 ('STILL_ACTIVE')를 반환하면 어떻게 될까요? – zett42

관련 문제