Я использую очереди сообщений (предоставляемые windows), чтобы помочь нескольким потокам в моей программе общаться. Тем не менее, мне нужно отправить сообщение всем потокам в моей программе сразу. Есть ли какая-нибудь функция для этого?Можно ли отправить сообщение ко всем темам?
ответ
Простые сообщения о потоке (без окна) ненадежны в Windows. Есть обстоятельства, при которых они проглатываются без следа и без вашего потока получают возможность справиться с ними. Поэтому мне нравится иметь окно верхнего уровня для потока для цели сообщения, так как сообщения, нацеленные на окно, всегда обрабатываются оконной процедурой для этого окна. Вы можете сделать это окно только для сообщений (с родителем HWND_MESSAGE
), если вам не нужно видимое окно для этого потока.
Как только у вас есть окно для каждого потока, вы можете просто перечислить окна EnumWindows
или EnumChildWindows
и отправить сообщения тем, которые вы хотите. Или вы можете сохранить список окон сообщений потоков и отправить сообщение каждому. Нет простого способа отправить сообщение всем потокам процесса.
Они пропускаются во время системно-модальных циклов, потому что ваш насос сообщений не работает. Если у вас нет видимых окон и вы не вызываете MessageBox или DialogBox, вы не будете запускать никаких системно-модальных циклов. – Tergiver
К сожалению, это не единственные функции, которые включают в себя насос сообщений (и, следовательно, падение сообщений потока). Например, использование COM-компонентов IIRC может привести к тому, что потоковые сообщения могут упасть при некоторых обстоятельствах. –
Ах да, COM .. Никогда не был поклонником. Избегайте, как чума. Разве COM не мертв? ;) – Tergiver
- 1. Можно ли отправить сообщение не всем наблюдателям, использующим .net Rx?
- 2. Можно ли отправить широковещательное сообщение всем экземплярам за ELB?
- 3. Можно ли отправить сообщение через GTalk Intent?
- 4. GCM отправить сообщение всем устройствам
- 5. Как отправить сообщение всем пользователям?
- 6. Как отправить сообщение ко всей теме
- 7. Можно ли найти ближайшую точку ко всем точкам субквадратического времени?
- 8. Можно ли применить декоратор TypeScript ко всем полям класса?
- 9. Можно ли применить фиксацию ко всем ветвям в git?
- 10. Можно ли получить Семантический (emacs) автоматический доступ ко всем файлам?
- 11. Можно ли применить преобразование ко всем элементам в XML jaxb
- 12. Можно ли отправить сообщение в будущее?
- 13. (Как) можно ли отправить сообщение одному клиенту?
- 14. Yaws websocket отправить сообщение всем подключенным пользователям
- 15. Как отправить сообщение всем экземплярам ролей сотрудников?
- 16. Firebase Cloud Messaging - Отправить сообщение всем пользователям
- 17. websocket отправить сообщение с сервера всем клиентам
- 18. netlogo: отправить сообщение всем, кроме одного агента
- 19. Как отображать и виджет по всем темам?
- 20. Изменения в ConcurrentHashMap видны всем темам?
- 21. Отправить сообщение всем пользователям telegram bot
- 22. GO Websocket отправить всем клиентам сообщение
- 23. Отправить сообщение всем подключенным клиентам веб-сокетов
- 24. Web Sockets - Отправить сообщение всем клиентам
- 25. Можно ли отправить сообщение всем устройствам, зарегистрированным с помощью идентификатора приложения?
- 26. MFC - Как отправить сообщение всем представлениям, полученным из класса CView?
- 27. Привязать поведение ко всем моделям
- 28. Сообщение Linux всем терминалам
- 29. Angular 2 отправить событие от родителя ко всем детям
- 30. Можно просмотреть статистику по темам по дате?
Почему? Они не могут все начать обработку в одно и то же мгновение, так что в чем проблема с вызовом PostThreadMessage N раз? – Tergiver
У меня иногда будет переменное количество потоков, поэтому было бы сложно понять, какие потоки отправлять. – Mark
Вы пробовали отправлять сообщения HWND_BROADCAST? Я не уверен, какие условия должны быть выполнены для потока, чтобы получить это. Для каждого потока может потребоваться окно верхнего уровня, я просто не уверен. Если вы используете HWND_BROADCAST, убедитесь, что вы используете RegisterWindowMessage. – Tergiver