Microsoft Windows의 메시지 루프

Message loop in Microsoft Windows

메시지 루프Microsoft Windows에서 그래픽 사용자 인터페이스를 사용하는 모든 프로그램에서 코드의 필수 섹션이다.GUI가 있는 Windows 프로그램은 이벤트 중심이다.Windows는 창을 만든 각 스레드에 대해 개별 메시지 큐를 유지 관리한다.보통 첫 번째 실만 창을 만든다.Windows(윈도우)는 스레드의 창에서 마우스 작업이 발생할 때마다, 해당 창에 포커스가 있는 동안 키보드 작업이 발생할 때마다, 그리고 다른 때에 메시지를 해당 대기열에 배치한다.프로세스는 또한 자체 대기열에 메시지를 추가할 수 있다.사용자 입력을 수락하려면, 그리고 다른 이유로, 창이 있는 각 스레드는 해당 대기열에서 지속적으로 메시지를 검색하고 그에 따라 작업을 수행해야 한다.프로그래머는 GetMessage(메시지를 차단하고 검색하는)를 호출한 후 DispatchMessage(메시지를 발송하는)를 호출하는 루프를 작성하고 무한정 반복하는 방식으로 프로세스를 만든다.이게 메시지 루프야.메인 프로그램에는 보통 메인 스레드에서 실행되는 메시지 루프가 있고, 만들어진 각 모달 대화 상자에는 추가 메시지 루프가 있다.프로세스의 모든 창에 대한 메시지는 메시지 대기열을 통과하며 메시지 루프에 의해 처리된다.메시지 루프는 이벤트 루프의 한 종류다.

기본 메시지 루프는 다음과 같이 나타난다.

인트로 위나피 윈메인(하이스턴스 h인스턴스, 하이스턴스 hPrevInstance, LPSTR lpCmdLine, 인트로 nCMdShow) {     MSG 음스그;     BOOL 브렛;      하는 동안에 (1)     {         브렛 = 겟메시지(&음스그, NULL, 0, 0);          만일 (브렛 > 0)  // (bret > 0)은 반드시 처리해야 하는 메시지를 나타낸다.)         {             번역메시지(&음스그);             디스패치메시지(&음스그);         }         다른 만일 (브렛 < 0)  // (bRet == -1은 오류를 나타낸다.)         {             // 오류를 처리하거나 기록하십시오. 종료될 수 있음.             // ...         }         다른  // (bret == 0은 "exit program"을 나타낸다.)         {             부숴뜨리다;         }     }     돌아오다 음스그.wParam; } 

이벤트 루프가 호출하는 것은 관례다.TranslateMessage가상 키 입력을 문자열로 변환할 수 있는 각 메시지.호출TranslateMessage기술적으로 요구되지는 않지만, 불리지 않으면 문제가 발생할 수 있다.메시지 루프가 호출해야 함DispatchMessage.

메시지 루프는 자신이 처리하는 메시지에 직접 작용하지 않는다.그것은 전화해서 그들을 파견한다.DispatchMessage("창 프로시저"는 메시지가 주소 지정된 창의 "창 프로시저"로 메시지를 전송한다. ("창 프로시저"는 콜백 프로시저로, 등록될 때 창 클래스와 연결되었다.) (하나 이상의 윈도우가 동일한 윈도우 프로시저를 사용할 수 있다.)

코드는 또한 윈도우 프로시저로 직접 메시지를 보낼 수 있다.이것을 비대기열 메시지라고 한다.

엄격한 메시지 루프만이 유일한 선택은 아니다.프로그램의 다른 곳에서도 코드는 메시지를 수신하고 발송할 수 있다. PeekMessage대기 중인 메시지가 있는 경우 즉시 반환하거나 대기 중인 메시지가 없는 경우 메시지 없음. WaitMessage메시지가 대기열에 있을 때까지 스레드를 절전 모드로 전환하십시오.

Windows Forms, Windows Presentation Foundation, MFC, Delphi, Qt 등과 같은 최신 그래픽 인터페이스 프레임워크는 응용프로그램이 프레임워크에 정의된 대로 키 누름, 마우스 클릭과 같은 이벤트를 적절한 처리기로 자동으로 라우팅하므로 Windows 메시지 루프를 코드화할 필요가 없다.그러나 각 프레임워크는 어디선가 메시지 루프를 구현하며, 메시지 루프는 일반적으로 보다 직접적인 통제가 필요할 때 접근하거나 교체할 수 있다.

참고 항목

외부 링크