모달 vs 모달 리스 다이얼로그 - 쓰레드 와 메시지 루프 - C # 프로그래밍 배우 기 ( Learn C # Programming ) 
 [ 제목 ] 모달 vs 모달 리스 다이얼로그 - 쓰레드 와 메시지 루프 
 C # 에서 간단 한 윈 폼 프로그램 을 만들 어 보 면 다음 예제 와 같이 하나 의 Form 객체 를 생성 하 고 이 를 실행 하 는 것 이 다 . 그러면 이 간단 한 코드 는 무엇 을 하 는 것 일까 ? 
 Main ( ) 메서 드 를 호출 하 는 쓰레드 는 Main Thread 라 불리우 는데 , 이 쓰레드 는 Form 1 객체 를 Managed Heap 에 만들 고 Application . Run ( ) 이 라는 static 메 서 드 를 호출 한다 . Application . Run ( ) 는 내부 적 으로 해당 폼 객체 를 윈도우 로 참조 하 여 메시지 루프 를 생성 하 고 Form 1 윈도우 를 화면 에 보여준다 . 다시 말 하 면 , C # 에서 메시지 루프 를 만드 는 곳 은 Application . Run ( ) 이 다 . 이 메시지 루프 는 물론 메인 쓰레드 에서 돌 게 된다 . 즉 , Application . Run ( ) 실행 으로 별도 의 쓰레드 가 생성 되 지 는 않 는다 . ( 이론 적 으로 별도 의 쓰레드 로 Application . Run ( ) 을 여러 번 실행 하 여 복수 개 의 윈도우 폼 을 가진 복수 개 의 UI 쓰레드 를 만들 수 있 다 ) 
 그러면 이제 이렇게 생성 된 메인 윈도우 에서 다른 폼 을 띄우 는 예 를 살펴보 자 . 아래 는 Form 1 에서 Form 2 폼 을 Modal 다이얼로그 로 띄우 는 경우 와 Non - Modal 다이얼로그 로 띄우 는 경우 를 예 로 들 고 있 다 . 
 / / 모달 다이얼로그 띄우기 
 private void btnModal _ Click ( object sender , EventArgs e ) 
 / / 모달 리스 다이얼로그 띄우기 
 private void btnNonModal _ Click ( object sender , EventArgs e ) 
 먼저 Modal 다이얼로그 를 띄우 면 무슨 일 이 일어나 는가 ? Form . ShowDialog ( ) 를 호출 하 면 해당 폼 이 Close 되 지 않 는 한 그 프로그램 내 의 다른 폼 들 을 엑세스 할 수 없 다 . 그러면 새로운 폼 ( Form 2 ) 윈도우 는 새로운 쓰레드 에서 도 는가 ? 혹은 새로운 메시지 루프 를 갖 는가 ? Modal 다이얼로그 를 생성 하 는 ShowDialog ( ) 메 서 드 는 새로운 쓰레드 를 생성 하 지 않 는다 . 하지만 , 내부 적 으로 Application . RunDialog ( ) 를 호출 하 여 새로운 메시지 루프 를 생성 한다 . 즉 , 위 의 예제 의 경우 , Form 1 을 실행 하 던 메인 UI 쓰레드 가 Modal 다이얼로그 를 띄우 고 새로운 메시지 루프 를 돌 며 그 다이얼로그 의 UI 메시지 를 처리 하 게 된다 . 
 그렇 다면 , Non - Modal 다이얼로그 는 어떠 한가 ? Form . Show ( ) 메서 드로 Non - Modal 다이얼로그 를 띄우 면 , 해당 Form 2 윈도우 에 Owner 윈도우 를 셋 팅 한 후 그 폼 을 보여 주 게 된다 . 위 의 경우 Owner 윈도우 는 Form 1 이 되 는데 , 만약 Form 1 을 Close 하 면 Form 2 는 자동 으로 Close 되 는 효과 를 갖 는다 . Non - Modal 다이얼로그 는 새로운 쓰레드 를 생성 하 지 도 않 고 , 새로운 메시지 루프 를 생성 하 지 도 않 는다 . 즉 , ( 위 의 경우 ) 메인 쓰레드 가 메인 메시지 루프 를 이용 해 Non - Modal 다이얼로그 메시지 를 처리 하 는 것 이 다 . 
 csharpstudy | 7 / 2 / 2014