.net - 프로그램 - 이벤트 처리기




Windows Forms-다중 이벤트 루프 (4)

MDI (Multiple Document Interface) 컨테이너 및 하위 폼을 사용하는 것이 더 현명 할 수 있습니다. 이 경우 각 문서는 고유 한 형식으로되어 있기 때문에 기술적으로는 각 문서가 자체 메시지 대기열을 가짐을 의미합니다.

여러 문서를 동시에 열어 볼 수있는 Windows Forms (.NET) 응용 프로그램이 있습니다.

각 문서 (양식)에 자체 이벤트 루프가 실행되는 것이 편리합니다. 간단한 실험을 통해 자체 STA 스레드에서 여러 이벤트 루프를 시작하는 것이 효과가있는 것 같습니다. 이것이 나쁜 생각 인 이유가 있습니까?


다른 스레드에서 여러 메시지 루프를 작성하는 것이 좋다고 생각합니다. 조심해야 할 것은 제 3 자 UI 툴킷을 다루는 것입니다. 스레드 핸들러를 스레드 스태틱 대신 정적으로 저장하는 경우가 있습니다. 애플리케이션에 UI 스레드가 여러 개있을 경우 문제가 발생합니다. (제 경우에는 발견했습니다. 메뉴 / 툴바 키보드 가속기가 제대로 작동하지 않음).

이렇게하는 가장 큰 이유 중 하나는 모덜리스 대화 상자가 다른 모덜리스 대화 상자에 표시되는 경우입니다. 모든 것을 동일한 메시지 루프에 놓으면 모덜리스 대화 상자 중 하나에 모달 대화 상자가있는 경우 모달 대화 상자를 닫을 때까지 전체 응용 프로그램 (모든 창)이 차단됩니다.

Kevin이 말한 것처럼 크로스 윈도우 (cross-thread) 호출에주의하십시오. Control.BeginInvoke 또는 Control.Invoke를 사용하여 다른 UI 스레드에 대리자 호출을 게시 할 수 있습니다.

고려해야 할 다른 사항은 프로세스를 종료하는 방법입니다. 대부분의 경우 메시지 루프를 추적해야하므로 모든 것을 닫을 때 메시지 루프를 막을 수 있습니다. 걱정하지 않고 모든 창이 닫힌 상태에서 프로세스가 끝나길 원한다면 그렇게 할 수도 있습니다.


스레드에서 GUI 요소에 액세스 할 때주의하십시오.


왜 당신은 하나 이상의 메시지 루프가 필요하다고 생각합니까? 하나의 메시지 루프는 여러 개의 창을 처리 할 수 ​​있습니다.

한 창에서 오랫동안 실행되는 작업이 전체 앱을 걸 수 있다는 것을 알게되면 응답은 장기 실행 작업을 BackgroundWorker 와 같은 것으로 분리하여 UI를 응답으로 남겨 둡니다.

하나의 스레드가 다른 스레드에서 생성 된 창과 컨트롤에 액세스 할 수 없으므로 자체 UI가있는 여러 스레드로 프로그래밍하는 것이 훨씬 더 복잡합니다.





winforms