[제목] 모달 vs 모달리스 다이얼로그 - 쓰레드와 메시지 루프
이 아티클은 Modal 다이얼로그와 Modeless (혹은 Non-Modal) 다이얼로그의 쓰레드와 메시지 루프에 대한 간략한 Summary를 담고 있다. 윈폼을 예제로 사용하고 있지만, 기본 원리는 WPF에도 똑같이 적용된다.
C#에서 간단한 윈폼 프로그램을 만들어 보면 다음 예제와 같이 하나의 Form 객체를 생성하고 이를 실행하는 것이다. 그러면 이 간단한 코드는 무엇을 하는 것일까?
static class Program { [STAThread] static void Main() { Form form = new Form1(); Application.Run(form); } }
Main() 메서드를 호출하는 쓰레드는 Main Thread 라 불리우는데, 이 쓰레드는 Form1 객체를 Managed Heap에 만들고 Application.Run() 이라는 static 메서드를 호출한다. Application.Run()는 내부적으로 해당 폼 객체를 윈도우로 참조하여 메시지 루프를 생성하고 Form1 윈도우를 화면에 보여준다. 다시 말하면, C#에서 메시지 루프를 만드는 곳은 Application.Run() 이다. 이 메시지 루프는 물론 메인 쓰레드에서 돌게 된다. 즉, Application.Run() 실행으로 별도의 쓰레드가 생성되지는 않는다. (이론적으로 별도의 쓰레드로 Application.Run()을 여러번 실행하여 복수 개의 윈도우 폼을 가진 복수 개의 UI 쓰레드를 만들 수 있다)
그러면 이제 이렇게 생성된 메인 윈도우에서 다른 폼을 띄우는 예를 살펴보자. 아래는 Form1에서 Form2 폼을 Modal 다이얼로그로 띄우는 경우와 Non-Modal 다이얼로그로 띄우는 경우를 예로 들고 있다.
public partial class Form1 : Form { public Form1() { InitializeComponent(); } // 모달 다이얼로그 띄우기 private void btnModal_Click(object sender, EventArgs e) { Form form2 = new Form2(); form2.ShowDialog(); } // 모달리스 다이얼로그 띄우기 private void btnNonModal_Click(object sender, EventArgs e) { Form form2 = new Form2(); form2.Show(); } }
먼저 Modal 다이얼로그를 띄우면 무슨 일이 일어나는가? Form.ShowDialog()를 호출하면 해당 폼이 Close 되지 않는 한 그 프로그램 내의 다른 폼 들을 엑세스할 수 없다. 그러면 새로운 폼(Form2) 윈도우는 새로운 쓰레드에서 도는가? 혹은 새로운 메시지 루프를 갖는가? Modal 다이얼로그를 생성하는 ShowDialog() 메서드는 새로운 쓰레드를 생성하지 않는다. 하지만, 내부적으로 Application.RunDialog()를 호출하여 새로운 메시지 루프를 생성한다. 즉, 위의 예제의 경우, Form1 을 실행하던 메인 UI 쓰레드가 Modal 다이얼로그를 띄우고 새로운 메시지 루프를 돌며 그 다이얼로그의 UI 메시지를 처리하게 된다.
그렇다면, Non-Modal 다이얼로그는 어떠한가? Form.Show() 메서드로 Non-Modal 다이얼로그를 띄우면, 해당 Form2 윈도우에 Owner 윈도우를 셋팅한 후 그 폼을 보여주게 된다. 위의 경우 Owner 윈도우는 Form1 이 되는데, 만약 Form1을 Close하면 Form2는 자동으로 Close되는 효과를 갖는다. Non-Modal 다이얼로그는 새로운 쓰레드를 생성하지도 않고, 새로운 메시지 루프를 생성하지도 않는다. 즉, (위의 경우) 메인 쓰레드가 메인 메시지 루프를 이용해 Non-Modal 다이얼로그 메시지를 처리하는 것이다.
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.