본문 바로가기

Library/Windows Programming

윈도우 메세지와 메세지 큐

너무나 잘 알려진 이야기지만, 윈도우는 Event Driven 방식에 의해서 동작한다. 윈도우는 메세지 큐를 가지고 있으며, 윈도우가 생성하는 메세지는 이 메세지 큐를 이용하여 처리된다.

그렇지만, 중요한 것은 모든 메세지가 메세지 큐에 저장되는 것은 아니라는 점이다. 예를 들어, MFC의 CWnd 파생 개체들은 PreTranslateMessage()라는 메서드에서 메세지 큐에 들어있는 메시지를 미리 처리할 수 있는 기회를 가질 수 있는데, 가끔 원하는 메세지를 찾을 수 없는 경우가 있을 것이다. 그 이유는, 윈도우가 특정 메세지는 메세지 큐로 보내지 않고 바로 처리하기 때문이다. 또, 특정 메세지는 반드시 처리한다는 보장도 없다.

그러한 메세지 중 대표적인 것인 WM_TIMER 메세지이다. WM_TIMER 메세지는 주어진 시간 주기 동안 계속해서 발생되지만 이 메세지가 메세지 큐에 저장되는 것은 아니며, 또 메세지를 처리하는데 시스템 상황이 여의치 않다면 이 메세지를 처리하지 않는다. 윈도우가 강한 RTOS로서의 특징을 가지지 못하는 이유 중 하나다.

윈도우 프로그래밍을 하고 있다면 메세지 핸들러를 다루는데 매우 익숙하겠지만, 어떤 메세지가 메세지 큐에 쌓이는지, 어떻게 처리되는지는 관심을 기울이지 않는 경우가 많다. 간단하지만 지나치기 쉬운 부분이다.