【发布时间】:2009-12-23 09:35:18
【问题描述】:
当我将SendMessage 函数与HWND_BROADCAST 一起使用时,应用程序挂起。应用长时间没有响应。
谁能解释一下原因?
【问题讨论】:
当我将SendMessage 函数与HWND_BROADCAST 一起使用时,应用程序挂起。应用长时间没有响应。
谁能解释一下原因?
【问题讨论】:
当有一个进程具有顶级窗口,但没有在创建窗口的线程上调用 GetMessage 或 PeekMessage 时,就会发生这种情况。
为了向后兼容 Windows 3.0,SendMessage 在系统中的所有顶级窗口都响应您的广播之前不会返回。这种行为在 Windows 多线程之前是有意义的,因为 SendMessage(),即使发送到其他进程也永远不会阻塞。
但是从 Win32 开始,当您向另一个进程中的窗口发送消息时,实际发生的是您的线程阻塞,直到另一个进程中的线程唤醒并处理消息。如果该线程很忙,或者只是没有发送消息,那么您将永远等待。
因此,当您使用 HWND_BROADCAST 或向其他进程拥有的窗口发送消息时,您应该始终使用 SendNotifyMessage 或 SendMessageTimeout。
【讨论】:
这是因为当用HWND_BROADCAST 调用SendMessage 时,它首先枚举所有可用的窗口,然后为每个窗口调用SendMessage。 SendMessage 在窗口完成处理消息之前不会返回。如果单个窗口处理消息的时间过长,整个调用都会被延迟。
【讨论】:
有一个 SendMessageTimeout 将限制您的应用程序在等待接收方接受时阻塞的时间。
另一种解决方法是启动多个线程并让它们同时传递多条消息(即并行发送给它)。然后,如果其中一个接收器挂起,您不会杀死整个应用程序。
【讨论】:
至少有一个进程具有消息泵但不泵送消息。 SendMessage 在所有接收者都处理完消息之前不会返回......所以它不会返回。您可以尝试使用 SendMessageTimeout 来解决此问题。
顺便说一句,这就是为什么启动一个进程并等待它的进程句柄会充满问题。我在我的网站here 上对此进行了描述。
【讨论】: