Когда я использую the
SendMessage функционируют с HWND_BROADCAST
, приложение зависает. Нет никакого ответа из приложения в течение долгого времени.
Кто-либо может объяснить почему?
Это произойдет, если есть процесс, который имеет окно верхнего уровня, но не вызывает GetMessage или PeekMessage в потоке, создавшем окно.
Для обратной совместимости с Windows 3.0 SendMessage не вернется, пока все окна верхнего уровня в системе не ответят на вашу рассылку. Такое поведение имело смысл еще до того, как Windows стала многопоточной, потому что SendMessage () даже при отправке другим процессам никогда не блокировался.
Но начиная с Win32, когда вы отправляете сообщение окну в другом процессе, на самом деле происходит блокировка вашего потока до тех пор, пока поток в другом процессе не проснется и не обработает сообщение. Если этот поток занят или просто не перекачивает сообщения, то вы ждете вечно.
Есть, по крайней мере, один процесс, у которого есть насос сообщений, но нет насоса сообщений. SendMessage не возвращается, пока все получатели не обработают сообщение... поэтому оно не возвращается. Вместо этого можно попробовать использовать SendMessageTimeout.
Кстати, именно поэтому запуск процесса и ожидание его дескриптора может быть чревато проблемами. Я описываю это на своем сайте здесь .
. Это потому, что при вызове SendMessage
с помощью HWND_BROADCAST
сначала перечисляются все доступные окна, а затем для каждого из них вызывается SendMessage
. SendMessage
не вернется до тех пор, пока окно не завершит обработку сообщения. Если одному окну требуется много времени для обработки сообщения, весь вызов будет отложен.
Существует SendMessageTimeout, который ограничивает количество времени, в течение которого ваше приложение блокируется в ожидании приема приемником.
Другой обходной путь - запуск нескольких потоков и заставить их доставлять несколько сообщений одновременно (т.е. к нему параллельно). Тогда, если один из приемников повешен, вы не убьете все ваше приложение.