2011-09-15 6 views
3

일반적인 질문은 별도의 작업자 스레드에서 Windows 메시지 펌프에 여러 메시지를 게시 할 때 보낸 순서대로 대상에 나타 납니까? 즉 ..Windows에서 PostMessage() 메시지가 순서대로 나타나나요?

::PostMessage(m_hUsers, WM_BULKPROCESS, 0, 0); 
// ... some processing here ... 
::PostMessage(m_hUsers, WM_BULKDONE, 0, 0); 

m_hUsers는 작업자 스레드에서 메시지를 보내는 창에 대한 핸들 (HWND)입니다. 따라서, WM_BULKPROCESS는 항상 창에서 처음 나타날 것이고 (따라서 대화 상자 클래스의 핸들러에 의해 처리 될 것입니다), 또는 순서가 틀릴 수도 있습니다. 즉, WM_BULKDONE은 WM_BULKPROCESS보다 먼저 처리됩니다. ?

답변

2

창 메시지는 대기열에 저장됩니다. 따라서 FIFO 메커니즘에 의존 할 수 있습니다.

+0

그게 내가 듣고 싶었던 것입니다. 세르지오에게 감사드립니다. – AzHole

1

메시지 펌프에 특별히 메시지를 (의도적으로 또는 비 의도적으로) 발송하는 코드가있는 경우가 아니라면이 설정을 사용해야합니다. 어떻게 든 두 개의 메시지를 선택하고 순서가 잘못된 순서로 전달합니다. 일반적으로 프로그래머는 대기열에서 가져온 순서대로 각 메시지에 대해 DispatchMessage를 호출합니다.

5

WM_PAINT와 같은 몇 가지 예외가 있지만 일반적으로 메시지 순서가 유지됩니다. 메시지가 잘못된 순서로 나타난 경우 마우스 입력을 이해하려고하는 이미징! 이 통화 도중 GetMessage 함수

에서

견적, 시스템, nonqueued 메시지를 보류 제공한다 , 및 SendMessage, SendMessageCallback, SendMessageTimeout 또는 SendNotifyMessage를 사용하여 호출 스레드가 소유 한 창에 보낸 메시지 기능. 그런 다음 지정된 필터가 과 일치하는 대기중인 첫 번째 메시지가 검색됩니다. 시스템에서 내부 이벤트를 처리 할 수도 있습니다. 어떤 필터가 지정되지 않은 경우, 메시지는 다음과 같은 순서로 처리됩니다

Sent messages 
Posted messages 
Input (hardware) messages and system internal events 
Sent messages (again) 
WM_PAINT messages 
WM_TIMER messages 
0

나는 문제가 동기화되지 메시지 큐 의심. 코드에서 작업자 스레드 proc의 multitple 호출을 허용하는 경우 작업자 스레드의 "인스턴스"가 메시지를 게시하고 있음을 알기 위해 코드를 더 자세히 관리해야합니다.

한 번에 하나의 작업자 스레드 만 실행하는지 또는 m_hUsers 창 핸들이 BULKPROCESS와 BULKDONE간에 변경되지 않도록 확인 했습니까?

SendMessage는 메시지가 처리 될 때까지 차단되므로 BULKDONE을 관리하는 데 유용 할 수 있습니다. 작업 스레드를 호출하는 코드가 작업자 스레드의 호출을 동기화하고 다른 호출 전에 작업자 스레드가 완료되었음을 알 수 있습니다. postmessage는 차단하지 않지만 작업자 스레드의 시간에 민감한 부분은 `// ... 일부 처리 중 ... 은 Windows 메시지를 보내지 않음을 기억하십시오.

관련 문제