2010-05-31 4 views
2

나는 작업중인 응용 프로그램에서 매우 실망스러운 버그가 있습니다. 루틴은 한 창에서 무언가를 수행 한 다음 메서드 끝 부분에서 포커스를 다른 개체로 반환해야하지만 다른 날짜에 큰 데이터 집합을 사용하기 시작하면 끝에 포커스가 돌아 가지 않습니다. 한 번에 한 줄 씩 코드를 밟았으며 오류가 중지되었습니다. 그래서, 나는 어떤 종류의 타이밍 문제라고 생각한다. 내가 의심 할 바를 찾아 낼 때까지 추적을합니다. 범인입니다. 내가 사용하는 이미지 편집기를 종료하는 ShellExecute (...) 호출. (http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx)내 창 포커스 문제를 해결하려면 어떻게해야합니까?

이제이 호출을 거친 다음 프로그램을 계속 실행하면 모든 것이 제대로 작동하지만이 줄을 지나면 오류가 발생합니다. 어떻게 이럴 수있어? 이 메서드의 끝에 SetFocus() 호출이 있습니다. 프로그램이이 문제를 일으키지 않아야할까요? 당신이 말하는 것처럼이 모든 때문에 매우 실망

...

+1

메소드 용 코드, 제발 .... –

+0

장기 실행 메소드에서 대기열에 메시지를 넣고 있습니다. 다른 스레드에서 실행중인 항목이 있습니까? – kenny

답변

4

가장 먼저해야 할 일은 windows/messages/focus 등에 관련된 Win32 API 호출입니다. 은 타이밍에 의존합니다. 모든 스레드에는 고유 한 창/메시징 하위 시스템이 있으며 여기에는 경쟁 조건이 없습니다.

당신이 묘사하는 것은 다른 것입니다. 실제로 다른 프로세스 (응용 프로그램)를 시작합니다.이 프로세스는 사용자 프로세스와 동시에 실행됩니다. ShellExecute비동기 기능입니다. 프로세스를 작성한 직후에 리턴되며, 지금부터는 애플리케이션과 작성한 프로세스가 동시에 실행됩니다.

이제 시스템의 한 창에만 한 번에 포커스가있을 수 있습니다. 생성 한 프로세스가 포커스를 훔칠 가능성이 큽니다. 이를 피하려면 먼저 해당 프로세스가 완료 될 때까지 기다린 다음 포커스를 창에 복원하고 작업을 계속해야합니다.

이렇게하려면 생성 된 프로세스의 핸들을 가져 와서 Win32 대기 함수를 호출해야합니다. ShellExecute은 생성 된 프로세스의 핸들을 반환하지 않습니다. 그러나 ShellExecuteEx - 않습니다. BTW를 사용하면 원하는대로 UI를 표시하지 않도록 지침이있는 프로세스를 시작할 수도 있습니다.

당신은 이런 식으로 작성해야 :

SHELLEXECUTEINFO sei; 
memset(&sei, 0, sizeof(sei)); 
sei.cbSize = sizeof(sei); 
sei.fMask = SEE_MASK_NOCLOSEPROCESS; 
sei.lpFile = L"notepad.exe"; 
sei.nShow = SW_SHOWNORMAL; // or SW_HIDE if you don't want to show it 

if (ShellExecuteEx(&sei)) 
{ 
    // wait for completion 
    WaitForSingleObject(sei.hProcess, INFINITE); 
    CloseHandle(sei.hProcess); 
} 

이 도움이

P.S.해야한다 물론 생성 된 프로세스의 핸들을 닫아야합니다. 즉 WaitForSingleObject 다음에 CloseHandle을 호출해야합니다.

+0

감사합니다. 톤. 나는 며칠 전에 다른 해결 방법을 찾아 냈지만, 이것을 구현했고 훨씬 덜 해킹당했습니다. – Ben313

0

이 문제는 타이밍처럼 들린다.

이 난에서 ShellExecute 기능에 익숙하지 않은 해요,하지만 당신이 링크 된 페이지에서 :

에서 ShellExecute 쉘 확장에 실행 (데이터 소스, 상황에 맞는 메뉴 처리기, 동사의 구현을) 위임 할 수 있기 때문에

"활성화하여 구성 요소 개체 모델 (COM), ShellExecute 호출되기 전에 COM을 초기화해야합니다. 일부 셸 확장 COM 단일 스레드 아파트 (STA) 형식이 필요합니다.

그게 관련이 있습니까?

관련 문제