문제

를 쓰고 있는 응용 프로그램을 시작하며 모니터에서 다른 응용 프로그램 C#.내가 사용하는 시스템입니다.Diagnostics.프로세스 클래스는 응용 프로그램을 시작한 다음 모니터링 응용 프로그램을 사용하여 처리합니다.응답을 제공하는 설문 조사 응용 프로그램의 상태가 매 100milisecs.내가 사용하는 과정입니다.CloseMainWindow 응용 프로그램을 중지 또는 과정입니다.죽을 죽이지 않은 경우 응답하지 않습니다.

가 이상한 행동 때로는 프로세스 개체가 가져오는 상태로 응답 속성은 언제나 true 를 반환합니다 경우에도 기본적인 프로세스를 정도 반복하고 그것이 어디에 응답하지 않 CloseMainWindow.

하나 그것을 재현하는 방법을 조사하는 것입 응답산권 프로세스를 시작한 후 인스턴스입니다.그래서 예를 들어,

_process.Start();
bool responding = _process.Responding;

을 재현한 오류 상태

_process.Start();
Thread.Sleep(1000);
bool responding = _process.Responding;

작동합니다.감소 절전 기간 500 소개하는 오류 상태가 다시합니다.

에서 뭔가를 부르 _process.응답이 너무 빨리 시작한 후에는 것을 방지하는 객체에서 오른쪽 windows 메시지 큐 처리기입니다.나 기다릴 필요가 _process.시작을 완료 하는것이 비동기적 작동합니다.더 나은 방법을 기다리는 이보다는니다.잠?내가 너무 확신 1000ms 항상 있을 것이 충분하다.

도움이 되었습니까?

해결책

지금,나는 이 나중에 알고 보니,그러나 나는 확실히 있는 방법을 알려 주는 쓰레드를 기다릴 준비가 될 때까지 입력하십시오.당신은 모니터링 GUI 프로세스?

과정입니다.WaitForInputIdle 의 어떤 도움을까?또는 나는 없나요?:)

업데이트

다음 chit-chat 트위터에서(또는 트윗 트윗?) 와 Mendelt 생각해야 업데이트 내 대답이 너무 커뮤니티에 충분히 인식하고..

  • WaitForInputIdle 에서 작동이 있는 응용 프로그램 GUI.
  • 지정을 기다리는 시간,그리고 방법을 반환 bool 는 경우 프로세스에 도달하는 상태에서는 시간,할 수 있는 분명히 이를 사용하여 루프가 필요한 경우,또는 처리합니다.

도움이 됐으면 좋겠어:)

다른 팁

내가 생각하는 것이 더 나을 수도 있습니다 향상에 대한 확인 _process.응답을 하려고/정지를 죽이는 프로세스 경우 응답이 제공에 대해 false 를 반환하 5 초 이상(예를 들어).

나는 당신이 찾을 수 있습니다 아주 자주,응용 프로그램이 될 수 있습니다""응답 없음에 대한 두 번째 분할 동안 하고 있는 더 많이 처리합니다.

내가 믿고 더 관대하는 방법은 더 나은 일을 할 수 있도록,프로세스가"아니"응답 대한 짧은 시간에만 조치를 취하는 경우 반복적으로"아니"응답을 위해 여러 초(또는 그러나 당신이 원한다면).

주의:Microsoft 설명서를 나타냅니다 응답이 제공에 관한 특별히 사용자 인터페이스는 이유는 새로 시작하지 않을 수도 있습니다 UI 즉각 반응하는.

답변 주셔서 감사합니다. 이것

_process.Start();
_process.WaitForInputIdle();

문제를 해결하는 것 같습니다. 응답과 WaitforInputIdle은 커버에서 동일한 Win32 API 호출을 사용해야하기 때문에 여전히 이상합니다.

더 많은 배경 정보
GUI 응용 프로그램에는 메시지 대기열이있는 기본 창이 있습니다. 응답 및 WaitforInputIdle 프로세스가 여전히이 메시지 큐에서 메시지를 처리하는지 확인하여 작동합니다. 이것이 그들이 GUI 앱에서만 작동하는 이유입니다. 어쨌든 너무 빠르게 응답하는 것은 프로세스가 해당 메시지 대기열을 처리하는 것을 방해하는 것 같습니다. WaitforInputIdle에게 전화하면 그 문제가 해결되는 것 같습니다.

나는 이것을 이해할 수 있는지 확인하기 위해 반사판으로 뛰어 들어야합니다.

업데이트
시작 직후 프로세스와 관련된 창 손잡이를 검색하는 것만으로는 이상한 동작을 유발하기에 충분합니다. 이와 같이:

_process.Start();
IntPtr mainWindow = _process.MainWindowHandle;

나는 반사판으로 확인했고 이것은 표지 아래에서 응답하는 일입니다. MainWindowHandle을 너무 빨리 얻으면 잘못된 것을 얻고 프로세스의 나머지 수명 동안 또는 Compertion ()을 호출 할 때 까지이 잘못된 손잡이를 사용하는 것 같습니다.

업데이트
waitforInputIdle ()을 호출하면 문제가 해결됩니다. 응답 속성을 읽을 때마다 refresh ()를 호출하는 것이 더 잘 작동하는 것 같습니다.

나도 약 2 년 전에 프로젝트에서 그것을 알아 차렸다. 특정 소품 값을 요청하기 전에 .refresh ()를 호출했습니다. .refresh ()를 호출해야 할 때를 찾는 것은 시행 착오 접근 방식이었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top