KoreanFoodie's Study

Message Pump 의 동작 방식 이해와 응용 본문

Game Dev/Game Server

Message Pump 의 동작 방식 이해와 응용

GoldGiver 2022. 10. 20. 17:57

윈도우 메시지 처리 프로세스. 메시지 펌프를 이용한다!

먼저 Message Pump 란, 한 메시지를 처리하는 도중 메시지 큐로부터 다른 메시지를 꺼내 이를 처리하는 코드를 의미한다. 윈도우 어플리케이션의 경우, UI 및 사용자 입력 처리하는 과정에서 메시지 펌프를 적극 활용하고 있다. 기초적인 Message Loop 코드는 다음과 같다.

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{ 
   TranslateMessage(&msg); 
   DispatchMessage(&msg); 
}

그런데 GetMessage 의 경우 데드타임(메시지큐에 메시지가 없어 GetMessage 가 놀고 있는 시간)을 제대로 활용할 수 없어, PeekMessage 를 많이 활용한다. PeekMessage 는 메시지 큐에 메시지가 있든 없든 리턴을 하기 때문이다(메시지가 있으면 true, 없으면 false 리턴).

 

윈도우 메시지를 처리하려면,  프로그램은 해당 메시지를 처리할 윈도우 프로시져를 호출해야 한다. 윈도우 프로시져는 각 윈도우 종류(Window class)마다 하나씩 지정된 함수이며, 큐에서 꺼낸 메시지가 실제로 처리되는 함수이다. 메시지 펌프를 이용한 시나리오 예시는 다음과 같다.

  1. 사용자가 버튼을 클릭
  2. 사용자 입력 메시지(버튼 클릭)이 메시지 큐에 삽입
  3. 메시지 펌프를 통해 윈도우 프로시져에 메시지가 전달
  4. 메시지에 맞는 처리(버튼 클릭 효과 등)가 이뤄지고, 버튼 클릭에 맞는 이벤트 핸들러가 호출됨

 

다음 예시 코드는 사용자가 종료 메시지가 입력되기 전까지 계속 렌더링을 해 주고 있다(출처).

 MSG msg;

  bool done = FALSE;

 //Message Loop
 while(!done)
 {
  if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  {
   if(msg.message==WM_QUIT)
    done=TRUE;
   else
   { 
    TranslateMessage(&msg);
    DispatchMessage(&msg);
   }
  }
  else          
   RenderTest();  //메세지가 없는 경우는 backbone형태로 이 함수가 수행됨.
 }

 

 

 

Post Message (메시지 큐 사용) vs Send Message (메시지 큐 사용 X)

윈도우 메시지는 사용자 입력 뿐만이 아니라 프로그램 구성 요소들끼리 통신을 하는데도 사용된다. 구성 요소들끼리는 보통 빠른 응답 시간을 요구하므로, 메시지 큐를 사용하지 않고 직접 윈도우 프로시저로 메시지를 전달한다. 이런 경우 Send Message 를 사용한다. 반면 메시지 큐를 사용하는 경우는 Post Message 를 쓴다.

Comments