내용 보기

작성자

관리자 (IP : 172.17.0.1)

날짜

2020-08-11 08:20

제목

[C#] modal dialog의 메세지 루프


Modal Dialog창을 띄웠을때 프로세스가 어떻게 동작되는지 간단한 설명이다.

메인 스레드에서 Modal Dialog창이 Show() 되면 내부적으로 기존 메인 메세지 루프의 메세지 펌핑작업이 일시중단 되고 새로운 메세지 루프 처리 작업을 만든다. (Application.RunDialog())

새로운 스레드가 생성되는 것이 아닌 기존 Modal Dialog창을 호출했던 스레드에서 새로운 메세지 루프 작업이 생성된다.

Modal Dialog창이 표시 되면 프로세스 내부에 해당 스택 순서는 다음과 같다.

WinMain
    YourMainMessageLoop (Main Thread)
        DispatchMessage
            SomeMessageHandler
                DoModal

메인 스레드의 메세지 루프를 단순화 시켜 코드로 보자면

while(true) {
    Message m;
    GetMessage(out m);
    if (m.Msg == WM_QUIT) break;
    DispatchMessage(m);
  }
cs

이와 같은 로직이고, Modal Dialog창이 표시 될때 더이상 메세지를 Dispatch하지 않고, Modal Dialog창이 표시 되면서
새로 생성되는 메세지 루프가 생성되고 이 동작은 메인 메세지 루프 처리와 비슷하게 동작된다.
마찬가지로 코드로 보면

while (true) {
    Message m;
    GetMessage (out m);
    if (currentDialog.DialogResult! = DialogResult.None) break;
    DispatchMessage (m);
}
cs

이와 같은 형식이 된다.

여기서 중요한점은 메인 메세지 루프는 중지 되었지만 새로운 메세지 루프에서 메세지를 계속 Dispatch하고 있기 때문에
Windows에서 보내지는 메세지는 모두 응답하면서 처리가 된다. (렌더링, 타이머 Tick 처리 등..)

출처1

https://social.msdn.microsoft.com/Forums/vstudio/en-US/3f37a652-b558-4342-ade9-ad5ce68c9d01/why-does-showdialog-not-block-the-ui-thread-completely?forum=netfxbcl

출처2