Windows线程何时需要消息循环?为什么?

时间:2013-04-17 08:08:05

标签: windows multithreading

我何时需要在Windows应用程序中使用消息循环?

例如,对于Windows服务,我是否需要为我创建的每个线程或仅为主服务进程提供消息循环?

while(true)
{
    GetMessage(&messageHandle, 0, 0, 0);
    DispatchMessage(&messageHandle);
}

2 个答案:

答案 0 :(得分:2)

每个本机Windows程序至少包含一个消息循环(通常称为“消息泵”),就像您举例说明的那样。

这是为了能够处理由程序本身,其他应用程序或操作系统启动的Windows事件。

Windows事件的示例可以是定时器,套接字通信,GUI操作,剪贴板等。

许多API和框架为您实现了一个消息循环。这取决于您在特定情况下使用的内容。

(查看this Stack Overflow question中的答案,了解有关消息循环/消息泵的更多信息。)

现在问题的要点:许多或大多数程序可以正常使用一个消息循环。如果处理Windows事件需要很长时间(即它锁定当前线程),并且有些要求需要您继续处理新的窗口事件,那么您需要多个的情况通常是这样的。我可以想到两个具体的例子:

  1. 一个是在GUI应用程序中,您正在显示一个模态对话框(通常会冻结主消息泵并为对话框旋转一个新消息)
  2. 某种服务,由于外部依赖性和处理新I / O事件的及时性,I / O事件的处理可能需要很长时间才是至关重要的
  3. 在(1)中,这通常是您正在使用的GUI框架的结果,而不是您必须明确执行的操作。在(2)中,更好的处理方法是异步“完成每个事件的工作”,而不是阻止消息泵。

    总结:这取决于。 :-)在大多数情况下,您不需要使用多个消息循环,但如果必须,请执行此操作!

答案 1 :(得分:0)

应用程序:

基本上,当线程要创建和管理窗口时。这包括支持COM STA等的“隐藏”窗口。

没有窗口,没有Windows消息,也没有消息循环。

服务:

服务管理器需要处理服务消息,因此需要一个服务消息循环来启动/停止/无论如何。

对于在服务中启动的其他线程,不需要消息循环。