SendMessage (HWND_BROADCAST, …) зависает

Когда я использую theSendMessage функционируют с HWND_BROADCAST, приложение зависает. Нет никакого ответа из приложения в течение долгого времени.

Кто-либо может объяснить почему?

15
задан Jabberwocky 9 October 2018 в 10:37
поделиться

4 ответа

Это произойдет, если есть процесс, который имеет окно верхнего уровня, но не вызывает GetMessage или PeekMessage в потоке, создавшем окно.

Для обратной совместимости с Windows 3.0 SendMessage не вернется, пока все окна верхнего уровня в системе не ответят на вашу рассылку. Такое поведение имело смысл еще до того, как Windows стала многопоточной, потому что SendMessage () даже при отправке другим процессам никогда не блокировался.

Но начиная с Win32, когда вы отправляете сообщение окну в другом процессе, на самом деле происходит блокировка вашего потока до тех пор, пока поток в другом процессе не проснется и не обработает сообщение. Если этот поток занят или просто не перекачивает сообщения, то вы ждете вечно.

19
ответ дан 1 December 2019 в 03:14
поделиться

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

Кстати, именно поэтому запуск процесса и ожидание его дескриптора может быть чревато проблемами. Я описываю это на своем сайте здесь .

.
0
ответ дан 1 December 2019 в 03:14
поделиться

Это потому, что при вызове SendMessage с помощью HWND_BROADCAST сначала перечисляются все доступные окна, а затем для каждого из них вызывается SendMessage. SendMessage не вернется до тех пор, пока окно не завершит обработку сообщения. Если одному окну требуется много времени для обработки сообщения, весь вызов будет отложен.

.
4
ответ дан 1 December 2019 в 03:14
поделиться

Существует SendMessageTimeout, который ограничивает количество времени, в течение которого ваше приложение блокируется в ожидании приема приемником.

Другой обходной путь - запуск нескольких потоков и заставить их доставлять несколько сообщений одновременно (т.е. к нему параллельно). Тогда, если один из приемников повешен, вы не убьете все ваше приложение.

0
ответ дан 1 December 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: