2013-04-17 125 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

相關問題