我什么时候需要在 Windows 应用程序中使用消息循环?
例如,对于 Windows 服务,我是否需要为我创建的每个线程或仅用于主服务进程的消息循环?
while(true)
{
GetMessage(&messageHandle, 0, 0, 0);
DispatchMessage(&messageHandle);
}
我什么时候需要在 Windows 应用程序中使用消息循环?
例如,对于 Windows 服务,我是否需要为我创建的每个线程或仅用于主服务进程的消息循环?
while(true)
{
GetMessage(&messageHandle, 0, 0, 0);
DispatchMessage(&messageHandle);
}
每个本机 Windows 程序都包含至少一个消息循环(通常称为“消息泵”),就像您给出的示例一样。
这是为了能够处理由程序本身、其他应用程序或操作系统发起的 Windows 事件。
Windows 事件的示例可以是计时器、套接字通信、GUI 操作、剪贴板等。
许多 API 和框架为您实现了消息循环。这将取决于您在特定情况下使用的内容。
(有关消息循环/消息泵的更多信息,请查看此 Stack Overflow 问题中的答案。)
现在回到问题的要点:许多或大多数程序都可以在一个消息循环中正常工作。您需要多个事件的情况通常是处理 Windows 事件可能需要很长时间(即,它会锁定当前线程),并且有些要求也需要您继续处理新的窗口事件。我可以想到两个具体的例子:
在 (1) 中,这通常是您使用的 GUI 框架的结果,而不是您必须明确执行的操作。在 (2) 中,更好的处理方法是异步“完成工作”每个事件,而不是阻塞消息泵。
总之:这取决于。:-) 在大多数情况下,您不需要使用多个消息循环,但如果必须,就这样做!
应用:
本质上,当线程要创建和管理窗口时。这包括支持 COM STA 等的“隐藏”窗口。
没有窗口,没有窗口消息,不需要消息循环。
服务:
服务管理器需要处理服务消息,因此需要一个服务消息循环用于启动/停止/任何内容。
对于服务中启动的其他线程,不需要消息循环。