Windows 是否可以向所有线程发送消息?

Windows 是否可以向所有线程发送消息?,windows,multithreading,winapi,Windows,Multithreading,Winapi,我正在使用消息队列(由windows提供)来帮助程序中的几个线程进行通信。但是,我需要立即向程序中的所有线程发送消息。有什么功能可以做到这一点吗?普通线程消息(没有窗口)在Windows中是不可靠的——在某些情况下,它们会被吞没而没有任何痕迹,线程也没有机会处理它们。因此,我希望消息目标的每个线程都有一个顶级窗口,因为窗口目标消息总是由该窗口的窗口过程处理。如果不需要该线程的可见窗口,则可以将其设置为仅消息窗口(具有HWND\u message)的父窗口 一旦每个线程都有一个窗口,就可以使用En

我正在使用消息队列(由windows提供)来帮助程序中的几个线程进行通信。但是,我需要立即向程序中的所有线程发送消息。有什么功能可以做到这一点吗?

普通线程消息(没有窗口)在Windows中是不可靠的——在某些情况下,它们会被吞没而没有任何痕迹,线程也没有机会处理它们。因此,我希望消息目标的每个线程都有一个顶级窗口,因为窗口目标消息总是由该窗口的窗口过程处理。如果不需要该线程的可见窗口,则可以将其设置为仅消息窗口(具有
HWND\u message
)的父窗口


一旦每个线程都有一个窗口,就可以使用
EnumWindows
EnumChildWindows
枚举窗口,并将消息发送到所需的窗口。或者,您可以保留线程消息窗口的列表,并向每个窗口发送消息。没有简单的方法可以向进程中的所有线程发送消息。

为什么?它们不能同时开始处理,所以N次调用PostThreadMessage会有什么问题?我有时会有不同数量的线程,因此很难确定要发送到哪个线程。您是否尝试过向HWND_广播发送邮件?我不确定线程必须满足哪些条件才能接收该消息。它可能需要在每个线程上都有一个顶级窗口,我只是不确定。如果使用HWND_广播,请确保使用RegisterWindowMessage。广播可能不是一个好主意,因为它是桌面范围的,但API中没有用于进程范围的消息广播的内容。我想你必须维护一个活动线程ID的列表。好的,我想我已经有了一个好主意,我将如何做到这一点。感谢您的帮助,因为您的消息泵未运行,所以在系统模式循环期间,它们会被忽略。如果您没有任何可见的窗口,也没有调用MessageBox或DialogBox,则不会运行任何系统模式循环。遗憾的是,这些并不是包含消息泵(从而丢弃线程消息)的唯一函数。IIRC使用COM组件可能会导致线程消息在某些情况下丢失,例如。啊,是的,COM。。我从来都不是球迷。避免像瘟疫一样。COM还没死吗?;)