[WinAPI] 메시지 루프에 대한 간단한 고찰
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는 루프를 종료시키는 것이 아닌, 큐에 다음 메시지가 들어올 때 까지 대기합니다.