2011-01-22 3 views
0

Я использую очереди сообщений (предоставляемые windows), чтобы помочь нескольким потокам в моей программе общаться. Тем не менее, мне нужно отправить сообщение всем потокам в моей программе сразу. Есть ли какая-нибудь функция для этого?Можно ли отправить сообщение ко всем темам?

+0

Почему? Они не могут все начать обработку в одно и то же мгновение, так что в чем проблема с вызовом PostThreadMessage N раз? – Tergiver

+0

У меня иногда будет переменное количество потоков, поэтому было бы сложно понять, какие потоки отправлять. – Mark

+0

Вы пробовали отправлять сообщения HWND_BROADCAST? Я не уверен, какие условия должны быть выполнены для потока, чтобы получить это. Для каждого потока может потребоваться окно верхнего уровня, я просто не уверен. Если вы используете HWND_BROADCAST, убедитесь, что вы используете RegisterWindowMessage. – Tergiver

ответ

1

Простые сообщения о потоке (без окна) ненадежны в Windows. Есть обстоятельства, при которых они проглатываются без следа и без вашего потока получают возможность справиться с ними. Поэтому мне нравится иметь окно верхнего уровня для потока для цели сообщения, так как сообщения, нацеленные на окно, всегда обрабатываются оконной процедурой для этого окна. Вы можете сделать это окно только для сообщений (с родителем HWND_MESSAGE), если вам не нужно видимое окно для этого потока.

Как только у вас есть окно для каждого потока, вы можете просто перечислить окна EnumWindows или EnumChildWindows и отправить сообщения тем, которые вы хотите. Или вы можете сохранить список окон сообщений потоков и отправить сообщение каждому. Нет простого способа отправить сообщение всем потокам процесса.

+0

Они пропускаются во время системно-модальных циклов, потому что ваш насос сообщений не работает. Если у вас нет видимых окон и вы не вызываете MessageBox или DialogBox, вы не будете запускать никаких системно-модальных циклов. – Tergiver

+0

К сожалению, это не единственные функции, которые включают в себя насос сообщений (и, следовательно, падение сообщений потока). Например, использование COM-компонентов IIRC может привести к тому, что потоковые сообщения могут упасть при некоторых обстоятельствах. –

+0

Ах да, COM .. Никогда не был поклонником. Избегайте, как чума. Разве COM не мертв? ;) – Tergiver

Смежные вопросы