2010-08-16 2 views
2

GUI 스레드와 메시지 루프에 대한 기본적인 지식이 있지만 모달 창을 시작하는 한 창에 어떻게 적용되는지 궁금합니다. 만약 내가 추측해야만한다면, 두 윈도우가 같은 GUI 스레드 아래에서 실행 중이며 일부 매개 변수는 자식 윈도우 (모달 윈도우)가있는 이벤트 만 실행된다는 것을 나타냅니다. 그렇지 않으면 사용자에게 모달 윈도우를 지적합니다. .어떤 스레드가 .Net의 모달 대화 상자 창을 처리합니까?

이것은 단순한 교육을받은 추측이며 나는 정사각형이 잘못되었을 수도 있음을 인정합니다. "GUI 스레드"가 해당 스레드의 올바른 이름인지 확실하지 않지만, 사람들은 일반적으로 내가 말하는 것에 대해 추측 할 수 있습니다.

요약하면 간단히 말해서 스레드와 모달 창은 어떻게 함께 진행됩니까?

+1

모달 대화 상자를 여는 것은 블로킹 호출입니다. 호출 윈도우는 모달 대화 상자가 닫히고 더 이상의 이벤트 자체를 처리하기를 기다립니다. –

+0

@Robert Harvey, 부모 창을 차단하는 동안 모달 창은 새 스레드에서 실행됩니까? 그것은 정확히 다시 칠하는 것과 같은 부모 윈도우의 이벤트를 의미합니까? –

+0

제 생각에 모달 대화 상자는 여전히 기본 GUI 스레드에서 실행됩니다. 모달 대화 상자가 표시되는 동안 백그라운드에서 처리 (메인 폼의 다시 그리기 포함)가 필요하면 백그라운드 프로세스가 실행될 새 스레드를 스핀 오프해야합니다. –

답변

4

이것은 모순 될 수도 있지만 아니요, 새 창에 대해 새 스레드가 시작되지 않습니다. 그러나 새 메시지 루프가 열립니다. 이렇게하면 메시지가 Windows를 통해 계속 전달되고 다른 응용 프로그램이 중지되지 않습니다.

메시지가 도착하고 소유자 윈도우의 메시지 루프로 발송 될 수 있습니다. 소유자 윈도우에서 키보드 및 마우스 입력이 비활성화되었지만 다른 모든 메시지는 전송됩니다. Hans Passant의 참고 사항 : 사실 동일한 스레드의 모든 최상위 창은이 방법으로 비활성화됩니다.

질문에서 이미 터치 한 예로서 WM_PAINT이 부모 창으로 보내집니다. 그러나 WM_TIMER도 예로들 수 있습니다. WM_NCHITTEST과 같은 메시지는 입력 메시지이므로 전송되지 않습니다. WM_KEYDOWN 및 그와 유사하지 않습니다.

이렇게하면 메시지 상자를 이동할 수 있으며 기본 소유자가 깔끔하게 다시 그려 지거나 눈금 시계가 계속 똑딱 거리는 경우가 있습니다.

부분적으로 Rector and Newcomer's Win32 Programming 페이지의 752+에서 구할 수 있지만 여전히 가치 있고 유효한 정보입니다. 이 정보는 DialogBox, DialogBoxParam, DialogBoxIndirectDialogBoxIndirectParam뿐만 아니라 ..Ex 버전에도 적용됩니다. 내부적으로 이러한 Win32 API 함수는 WinForms에 의해 호출됩니다.

+0

'old'-하지만 Windows의 이러한 부분은 더 오래되었습니다. –

+0

@Tim, 맞습니다 :) 그 근원을 찾으려고했지만 [Microsoft가 사용하는 가장 오래된 참조는 Windows 2000입니다] (http://msdn.microsoft .com/en-us/library/ms645452.aspx), ['WinMain'] (http://msdn.microsoft.com/en-us/library/ms633559.aspx)조차도 기능이 더 이상 없습니다. – Abel

+0

@Abel, 그것은 역사를 다시 써주는 멋진 비트입니다 :). 아마도 MSDN의 해당 버전 번호는 _min (Microsoft에서 지원하는 Windows 버전, 첫 번째 Windows 버전 기능이 등장했습니다 _)입니다. 내 Windows 3.0 버전의 Petzold를 확인해야합니다. –

0

창 또는 창 메시지는 CreateWindowEx이라는 창을 생성 한 스레드에 의해 처리됩니다. 이는 응용 프로그램 코드와 CreateWindowEx API 호출 사이의 소프트웨어 계층으로 간접적 일 수 있지만 새 창을 만들 때 항상 호출됩니다.

4

두 창은 같은 스레드에 남아 있습니다. 이 스레드 (GUI 스레드)는 두 창에 대한 메시지를 계속 처리합니다. 모달 대화 상자에 대한 특별한 무엇

은 다음과 같습니다

  • 대화의 소유자는 메인 창으로 설정됩니다. 이렇게하면 대화 상자가 항상 주 창의 위에 나타납니다. It's possible to do this with modeless windows.

  • 소유자 창이 대화 상자가 열려있는 동안 사용자 입력 (마우스 및 키보드 메시지) 수신을 중지합니다. 대화 상자는 정상적으로 사용자 입력을받습니다. 대화 상자에서 컨트롤을 사용하지 않도록 설정하는 것과 같은 방법으로 소유자 창을 사용하지 않도록 설정하면됩니다.

+0

참고 : 물론 주인을 다른 창 (예 : 주니어 프로그래머가 잘못 수행 한 것), 즉 바탕 화면으로 설정할 수도 있습니다. – Abel

+0

임의의 측면 질문, 창 소유자를 바탕 화면으로 설정하는 것이 유리합니까? 나는 이것에 대해 들어 본 적이 없다. –

+0

장점이 없습니다. 단점은 Windows가 손상된다는 것입니다. –

0

모달 대화 상자가
https://msdn.microsoft.com/en-us/library/windows/desktop/ms644994(v=vs.85).aspx

모달 대화 상자 메시지를 처리하기 위해, 시스템 전체 응용 프로그램의 메시지 큐 일시적으로 장악, 자신의 메시지 루프를 시작합니다. 시스템이 대화 상자에 명시 적으로없는 메시지를 검색하면 해당 창에 메시지가 발송됩니다. WM_QUIT 메시지를 검색하면 응용 프로그램의 주 메시지 루프가 결국 메시지를 검색 할 수 있도록 메시지를 응용 프로그램 메시지 큐에 게시합니다.