C++/C++ 자문자답

[WinAPI] 메시지 루프에 대한 간단한 고찰

ruru14 2024. 1. 25. 20:01

DirectX에 대한 공부 이전에, WinAPI에 대한 학습이 부족했습니다.

이에 몇 가지 공부했습니다.

 

Q1. WinAPI의 메시지 루프

A1.

Windows 응용 프로그램은 사용자의 입력, OS의 이벤트를 메시지 큐에 저장합니다.

저장된 메시지 루프는 GetMessage, TranslateMessage, DispatchMessage등의 함수에 의해 확인, 수정, 전달될 수 있습니다.

 

Q2. 메시지 루프는 비동기인가?

A2. 

메시지 루프에 여러 스레드를 접근시켜 성능을 향상시킬 수 있는지에 대한 의문이었습니다.

메시지 루프가 비동기인지는 아직 확실하지 않지만, 이에 대한 글을 볼 수 있었습니다.

Why does the win32 message loop stop working when threaded?

메시지 루프를 스레드로 실행시켰을 때 루프가 종료된다는 내용의 질문이었습니다.

이에 대한 답변 중, 메시지 큐는 스레드마다 할당된다는 이야기가 있었습니다.

같은 메시지 큐에 여러 스레드가 접근하다는 아이디어가 잘못되어 있었다는 뜻 입니다.

 

Q3. 메시지 루프의 처리

A1.

MSG msg;

BOOL bRet;
while ( (bRet = GetMessage(&msg, nullptr, 0, 0)) != 0) {
    if (bRet == -1) {

    } else {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    }

위와 같은 간단한 예제에서, 메시지는 결과적으로 DispatchMessage에 의해 프로시저에 전달됩니다.

그 전에 GetMessage는 해당 메시지가 종료인지, 오류인지, 아닌지를 판별하는 역할을 수행합니다.

TranslateMessage는 키 입력 메시지에 대해, 입력된 키를 해석해 메시지 큐에 추가하는 역할을 수행합니다.

그 외의 TranslateMessage는 동작하지 않습니다.

 

Q4. 메시지 큐가 비어있을 수 있는가

A4.

메시지 큐는 비어있을 수 있습니다.

이 경우, GetMessage는 루프를 종료시키는 것이 아닌, 큐에 다음 메시지가 들어올 때 까지 대기합니다.