2013-04-17 124 views
3

我何时需要Windows应用程序中的消息循环?什么时候Windows线程需要消息循环,为什么?

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

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

回答

2

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

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

的Windows事件的例子可以为定时器,socket通信,GUI操作,剪贴板等

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

(检查this Stack Overflow question答案的更多信息,消息循环/消息泵。)

现在你的问题的要点:许多或大多数程序将正常工作与一个消息循环。如果处理Windows事件需要很长时间(即锁定当前线程),并且需要您也要处理新的窗口事件,那么您通常需要多个事件的情况通常是这样。我能想到的两个具体的例子:

  1. 一个是一个GUI应用程序,你正在展示一个模式对话框(通常冻结主消息泵和旋转起来的对话框一个新的)
  2. 一由于外部依赖性和处理新I/O事件的及时性,处理I/O事件需要很长时间的某种服务很重要

在(1)中,这通常是你正在使用的GUI框架,而不是你必须明确做的事情。 (2)更好的处理方式是每个事件异步“做好工作”,而不是阻塞消息泵。

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

0

应用程序:

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

没有窗口,没有窗口消息,不需要消息循环。

服务:

服务经理需要处理的服务信息,因此需要启动/停止/任何一种服务的消息循环。

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

+1

您不需要服务中的消息循环。服务管理器会从它自己的线程调用你的OnStart/OnStop等。当然你可能需要自己的循环,但这不是必需的。 – adrianm

相关问题