Сообщения PostMessage () появляются в Windows в порядке? - PullRequest
3 голосов
/ 15 сентября 2011

Общий вопрос: если я отправлю несколько сообщений в насос сообщений Windows из отдельного рабочего потока, будут ли они появляться в месте назначения в том порядке, в котором я их отправил?то есть ..

::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, даже если он был отправлен последним

Ответы [ 4 ]

5 голосов
/ 15 сентября 2011

Есть несколько исключений (например, WM_PAINT), но, как правило, порядок сообщений сохраняется. Imaging пытается понять смысл ввода мышью, если сообщения появляются в неправильном порядке!

Цитата из GetMessage

Во время этого вызова система доставляет ожидающие незаданные сообщения, то есть сообщения отправляются в окна, принадлежащие вызывающему потоку SendMessage, SendMessageCallback, SendMessageTimeout или Функция SendNotifyMessage. Затем первое сообщение в очереди, которое соответствует указанный фильтр получен. Система также может обрабатывать внутренние события. Если фильтр не указан, сообщения обрабатываются в следующий порядок:

Sent messages
Posted messages
Input (hardware) messages and system internal events
Sent messages (again)
WM_PAINT messages
WM_TIMER messages
2 голосов
/ 15 сентября 2011

Оконные сообщения хранятся в очереди.Таким образом, вы можете положиться на механизм FIFO.

1 голос
/ 15 сентября 2011

Они должны быть, если у вас в коде сообщений нет кода, который специально отправляет сообщения (намеренно или нет) по-разному, например, как-то выбирает два сообщения и отправляет их не по порядку.Обычно программисты вызывают DispatchMessage для каждого сообщения в порядке, который вы получаете из очереди.

0 голосов
/ 16 сентября 2011

Я подозреваю, что проблема заключается в синхронизации, а не в очереди сообщений. Если ваш код допускает множественные вызовы процесса рабочего потока, вам нужно более тщательно управлять этим, чтобы знать, какой «экземпляр» рабочего потока публикует сообщения.

Проверяли ли вы, что одновременно выполняется только один рабочий поток, или что дескриптор окна m_hUsers защищен от изменения между BULKPROCESS и BULKDONE?

SendMessage может быть полезен для управления BULKDONE, потому что он будет блокироваться до тех пор, пока сообщение не будет обработано, позволяя коду, вызывающему рабочий поток, синхронизировать вызов рабочих потоков и точно знать, что один рабочий поток завершен перед вызовом другого. Postmessage не будет блокировать, но помните, что чувствительная ко времени часть вашего рабочего потока `// ... некоторая обработка здесь ... не отправляет сообщения Windows.

...