2009-06-03 3 views
3

UI 스레드가 WaitHandle 또는 다른 스레딩 프리미티브에서 대기하는 동안 모든 Windows 메시지를 처리 ​​할 수있는 방법이 있습니까?WaitHandle을 기다리는 동안 메시지 루프를 실행하십시오.

매우 복잡한 재진입 문제를 일으킬 수 있다는 것을 알고 있습니다. 어쨌든하고 싶습니다.

EDIT : 대기는 UI 스레드에서 실행해야하는 복잡한 기능의 중간에 발생합니다. 따라서 wait를 백그라운드 스레드로 이동하는 것은 옵션이 아닙니다. (두 가지로 함수를 나누는 것은 복잡하고 유지 보수가 안되는 복잡함을 만들 것입니다.)

답변

4

별도의 백그라운드 스레드에서 전체 "복잡한 함수 - 할 수없는 - 분할 할 수"실행할 것이라고 GUI (Invoke/BeginInvoke 메서드를 사용하여 필요한 경우에만보고 할 수 컨트롤에).

더 향상된 버전에서는 UI가 아닌 UI가 아닌 컨트롤러에서 복잡한 기능을 실행해야하며 단위 테스트가 더 쉽습니다. UI를 다시 호출하고 UI에 결과를 표시하려면 컨트롤러에서 사용할 수있는 이벤트를 UI에 종속 시키면 쉽게 얻을 수 있습니다.

3

대기를 수행하고 적절한 시점에 메시지 (또는 무엇이든)를 통해 UI 스레드에 알리면 어떨까요?

차단 이벤트 중 UI 스레드 메시지 처리를 허용하는 일반적인 방법입니다.

편집 : 이제 알 수 있습니다. 앱 논리 로직이 UI 코드에 내장되어 있습니다. 글쎄, 이것은 정말로 디자인 문제입니다. 장기간에 걸쳐 UI에서 자체 포함 된 객체로 기능을 분리하고 작업자의 UI와 상태를 통신하는 일부 메커니즘을 사용하는 것이 더 낫습니다.

UI 코드를 UI에 집중시키는 이점 외에도 로직 코드를 개별적으로 단위 테스트 할 수 있습니다.

+1

+1, UI 스레드에서 기다리는 것은 시원하지 않습니다. 콜백을 사용하십시오. –

+0

UI 스레드 (UI에 바인딩 된 비 스레드 안전 데이터 객체)에서 실행해야하는 함수의 중간에서 기다리고 있기 때문에이를 분할하여 로컬 변수를 저장하고 싶지 않습니다. – SLaks

+0

UI 로직이 아닙니다. UI 스레드에서만 읽을 수있는 데이터 객체입니다. – SLaks

2

C#에 대해서는 확실하지 않지만 일반 Win32 프로그래밍에서는 실제 대기를 위해 MsgWaitFor ...() 함수 중 하나를 사용할 수 있습니다. 대기중인 객체가 신호가 될 때뿐만 아니라 메시지 대기열에 메시지가있을 때 사용자에게 알립니다. 메시지가있는 것으로보고되면 GetMessage(), TranslateMessage() 및 DispatchMessage()를 호출하여 메시지를 처리 ​​한 다음 대기 상태로 되돌릴 수 있습니다.

+0

CoWaitForMultipleHandles도 사용할 수 있어야합니다. .NET API가 있는지 확실하지 않습니다. – FuleSnabel

2

일반적으로 다른 스레드에 대기 조건을 설정하는 것이 좋습니다.

그러나 그 말은 대기 핸들에서 "대기"(제한 시간 초과, 이벤트 실행, 제한 시간 초과 등)를 포함하여 언제든지 메시지 펌프를 처리하기 위해 언제든지 Application.DoEvents으로 전화 할 수 있습니다. 를 통해 "the waithandle).

관련 문제