2016-06-24 6 views
1

나는 프로세스가 아직 살아 있는지 (내가 체크 한 순간에 나는 체크를 한 직후에 닫을 수 있다는 것을 알고있다.) 핸들을 가지고 WaitForSingleObject()을 호출하여 확인하려고한다. 핸들은 Process.MainWindowHandle에서 얻는다. 어떤이 IsIconic()와 잘 작동하지만 WAIT_FAILEDGetLastError()을 돌려 ERROR_INVALID_HANDLEWaitForSingleObject 반환 ERROR_INVALID_HANDLE

UInt32 r = WaitForSingleObject(handle, 0); 
if(r == WAIT_OBJECT_0) 
{ 
    MessageBox.Show("still running!"); 
} 
if(r == WAIT_FAILED) 
{ 
    throw new Win32Exception(Marshal.GetLastWin32Error()); 
} 
+0

[C#에서 WaitForSingleObject를 호출 중]의 가능한 복제본 (0120)을 참조하십시오. – MethodMan

+1

창 핸들을 기다릴 수 없습니다. 기다릴 수있는 핸들 유형은 https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032.aspx의 문서를 확인하십시오. – dxiv

+0

핸들이 유효하지 않다는 메시지가 표시됩니다. 핸들이 유효하지 않습니다. –

답변

5

당신은 창 핸들을 기다릴 수 없습니다. IsIconic()과 같은 창 관련 함수에 창 핸들을 전달할 수 있지만 커널 객체가 아니기 때문에 기다릴 수 없습니다. 다음 개체 기다릴 수

WaitForSingleObject 함수 :

  • 변경 알림
  • 콘솔 입력
  • 이벤트
  • 메모리 리소스를 The documentation 당신이 기다릴 수있는 개체의 목록을 제공 알림
  • 뮤텍스
  • 프로세스
  • 세마포어
  • 스레드가 종료 될 때까지 당신이 과정에서 대기하는 경우

따라서는, 당신은을 통해 액세스 할 수있는 프로세스의 핸들에 기다릴 수

  • 때 Waitable 타이머 Process.Handle 속성

    그러나 실제로 Win32 함수를 P/Invoke 할 필요는 없습니다. .NET Process 래퍼 클래스에는 프로세스를 대기하는 데 사용할 수있는 WaitForExit()WaitForInputIdle() 멤버 함수가 있습니다. 두 함수 모두 오버로드에 시간 초과 값이 있습니다.

    Process 클래스 래퍼를 사용하기 시작한 프로세스 인 경우 Process.HasExited 속성을 간단하게 조사 할 수 있습니다.

  • +2

    'Process' 객체를 가지고 있다면, 실제로 당신이 그 프로세스를 실제로 생성했는지 여부에 관계없이'HasExited'를 사용할 수 없습니까? 발신자가 스폰서 인 경우 왜주의해야하는지 알지 못합니다. –

    +0

    답변을 주셔서 감사합니다. 종료 될 때까지 기다리지 않고 프로세스를 시작하지 않았습니다. 나는 결정된 프로세스가 어떤 행동을하기 전에 특정 시간에 여전히 살아 있는지 확인하고 싶다. (매 x 초마다 일어난다.) – Jack

    +0

    @remy 내가 쓴 이유는 내가 어딘가에서 이것이 작동하지 않는다는 것을 기억한다. Process 클래스는 프로세스를 시작하지 않는 한이 정보를 추적하지 않습니다. 내 기억을 뒷받침하기 위해 [다음 기사] (https://msdn.microsoft.com/en-us/library/y111seb2.aspx)가 맨 위에 표시되어 있습니다. * "참고 :이 값은 프로세스 구성 요소에 의해 시작된 프로세스에만 반환됩니다. "* 완전히 사실 일 수는 없습니다. 절대적으로 확실하도록 참조 소스를 확인해야합니다. –