Когда мы отправляем сообщение «, если указанное окно было создано вызывающим потоком, оконная процедура вызывается немедленно как подпрограмма ».
Но «, если указанное окно было создано другим потоком, система переключается на этот поток и вызывает соответствующую оконную процедуру. Сообщения, передаваемые между потоками, обрабатываются только тогда, когда принимающий поток выполняет код поиска сообщения. » ( взято из документации MSDN для SendMessage
).
Теперь я не понимаю как (или, точнее, , когда ), вызывается целевая оконная процедура. Конечно, целевой поток не будет прерван (счетчик программы не изменяется). Я предполагаю, что вызов произойдет во время некоторой функции ожидания (например, GetMessage
или PeekMessage
), это правда? Этот процесс подробно описан где-то?
Обновление: обоснование этого объясняется флагом QS_SENDMESSAGE
GetQueueStatus()
и MsgWaitForMultipleObjects()
:
QS_SENDMESSAGE
A message sent by another thread or application is in the queue.
Это, наряду с дополнительными замечаниями в документации MSDN, означает, что сообщение, отправленное другим потоком, фактически отправляется в очередь. Затем, как только будут вызваны GetMessage
или PeekMessage
, оно будет обработано перед любым другим опубликованным сообщением и будет отправлено непосредственно в оконную процедуру.