Re[15]: SendMessage vs PostMessage
От: Блудов Павел Россия  
Дата: 13.03.03 03:42
Оценка:
Здравствуйте, Kirill_Luzanov, Вы писали:

KL>Если поток не вызывает GetMessage или PeekMessage — то сообщения из ДРУГИХ

KL>потоков НИКОГДА не будут обработанны!

Маленькое дополнение.
::SendMessage(hwndОкнаИзДругойНити) не вернется, до тех пор, пока оконная процедура
жтого окна не отработает. Тем не менее, эта оконная процедура может в свою очередь
сделать ::SendMessage(hwndОкнаИзНитиСделавшейSendMessage), и это сообщение тоже
будет обработано.

Дело в том, что если ::SendMessage() должна сидеть и ждать, пока отработает
другая нить, то она обрабатывает вызовы ::SendMessage() из других нитей
для "своих" окон. ::PostMessage() для "своих" окон не будут обработаны до
::Get/PeekMessage().

И еще интересный момент.
Если было послано сообщение из лругой нити, то ::MsgWaitForMutliObjs() вернет
WAITOBJECT_0 + nObjects, как если бы в очереди завелось сообщение,
и следующий вызов ::GetMessage() "дернет" напрямую оконную процедуру,
но не вернется, так как ему нечего возвращать.

Довольно популярная ошибка, даже WTL-ный мастер вставляет ее в проекты
MultiThreadedSDI.

Павел.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.