티스토리 뷰

C++/WinAPI

WinAPI : getMessage , peekMessage

채애 2021. 11. 22. 23:11
  • GetMessage / PeekMessage
    • 공통점
      • 필터 조건과 일치하는 메세지에 대한 메세지 큐를 확인한 다음, MSG 구조에 메세지를 복사한다.

 

 

  • GetMessage
    • 메세지가 없으면 메세지가 생길 때까지 기다린다.
    • 필터 조건과 일치하는 메세지가 큐에 배치될 때까지 반환하지 않는다.
    • 게임은 역동적이어야 하기 때문에 GetMessage 를 사용하는 것이 좋은 것은 아니다.
    • scanf 또는 cin 과 같은 함수처럼 무한정 기다리는 것과 같다.
    • GetMessage 의 특징
      • 제거한다, 대기한다, 양보한다.

 

 

  • PeekMessage
    • 메세지 큐에 있는지 여부에 관계없이 즉시 반환된다. 
    • 메세지가 있으면 true 리턴, 그렇지 않으면 false 리턴.
    • 메세지 펌프는 false 동안 계속 루프를 실행하며 그 때마다 PeekMessage 메세지 큐를 검사한다.
    • 처리할 메시지가 있으면 그것이 WM_QUIT 인가를 검사하고, 맞다면 True 후 프로그램 종료.
    • 만약 WM_QUIT 이외에 메세지가 메세지 큐에 있었다면, 메세지를 처리하고 큐에서 제거한다.
    • 더이상 처리할 메세지가 없으면, 윈도우를 다시 그리기 위해 InvalidateRect 와 updateWindow 를 호출한다.
    • PMREMOVE / PM_NOREMOVE
    • PeekMessage 의 특징
      • 대기하지 않고, 양보하지 않는다.

 

 

  • Windows Programming
    • 윈도우즈 프로그래밍은 기본적으로 메세지 처리 방식이다.
    • 메세지 큐를 가지는 것은 전부 윈도우 이다.
    • 메세지 큐?
      • 윈도우즈에서 발생하거나, 넘겨준 메세지를 저장하고 있는 곳이다.
      • 메세지 큐에 저장된 메세지들이 해당 윈도우로 흘러 들어가서 처리하는 것이 윈도우즈 프로그래밍의 기본 원리이다.
      • 버튼/Edit창/대화상자 모두 메세지 큐를 가지는 윈도우이다.
      • 윈도우 핸들(HWND)을 이러한 윈도우를 제어할 때 쓰는 이름표이다.
      • 윈도우의 거의 모든 API 함수를 모두 넣은 클래스가 CWnd 라는 MFC 클래스 이다.
        • CWnd::m_hWnd

 

 

  • Message Loop
    • 시스템은 각 스레드에 대한 메세지 큐를 자동으로 만들지 않는다.
    • 시스템은 메세지 큐가 필요한 작업을 수행하는 스레드에 대해서만 메세지 큐를 만든다.
    • 스레드가 하나 이상의 창을 만드는 경우, 메세지 루프를 제공해야 한다.
    • 메세지 루프?
      • 스레드의 메세지 큐에서 메세지를 검색하고, 적절한 창 프로시저로 디스패치 한다.
      • 시스템은 메세지를 애플리케이션의 개별 창으로 전달하므로, 스레드는 메세지 루프를 시작하기 전에 하나 이상의 창을 만들어야 한다.
      • 대부분의 애플리케이션에는 창을 만드는 단일 스레드가 포함된다.
      • 주 창에 대한 창 클래스를 등록 → 주 창을 만들고 표시 → WinMain 함수에서 메세지 루프를 시작.
    • GetMessage / DispatchMessage / TranslateMessage / PeekMessage

 

 

  • Windows Message 3개 함수
    • GetMessage 함수로 메세지들을 가져온다.
    • TranslateMessage 함수를 통해 번역한다.
    • DispatchMessage 함수를 통해 메세지 처리함수 ( WndProc) 으로 전달한다.
    • WndProc 이 최종적으로 해당 메세지를 처리한다.

 

 

  • 메세지 큐 검사
    • PeekMessage 함수를 사용하여 긴 작업 중에 메세지 큐를 검사할 수 있다.
    • 그 외 GetQueueStatus 및 GetInputState 를 비롯한 함수도 스레드의 메세지 큐 내용을 검사할 수 있다.
      • GetQueueStatus
        • 큐의 메세지 유형을 나타내는 플래그 배열을 반환한다.
        • 큐에 메세지가 포함되어 있는지 여부를 검색하는 가장 빠른 방법이다.
      • GetInputState
        • 큐에 마우스/키보드 메세지가 포함된 경우 True 를 반환한다.

 

 

  • Windows API 에서의 게임 구조
    • 게임 메세지가 없어도 계속적으로 처리해야 된다면, PeekMessage 를 사용하여 렌더링을 해주는 식으로 사용한다. 

peekMessage

 

댓글