我何時需要Windows應用程序中的消息循環?什麼時候Windows線程需要消息循環,爲什麼?
例如,對於Windows服務,是否需要爲我創建的每個線程或僅用於主服務進程的消息循環?
while(true)
{
GetMessage(&messageHandle, 0, 0, 0);
DispatchMessage(&messageHandle);
}
我何時需要Windows應用程序中的消息循環?什麼時候Windows線程需要消息循環,爲什麼?
例如,對於Windows服務,是否需要爲我創建的每個線程或僅用於主服務進程的消息循環?
while(true)
{
GetMessage(&messageHandle, 0, 0, 0);
DispatchMessage(&messageHandle);
}
每個本機Windows程序至少包含一個消息循環(通常稱爲「消息泵」),就像您舉例說明的那樣。
這是爲了處理由程序本身,其他應用程序或操作系統啓動的Windows事件。
的Windows事件的例子可以爲定時器,socket通信,GUI操作,剪貼板等
許多API和框架實現消息循環給你。這將取決於您在特定情況下使用的內容。
(檢查this Stack Overflow question答案的更多信息,消息循環/消息泵。)
現在你的問題的要點:許多或大多數程序將正常工作與一個消息循環。如果處理Windows事件需要很長時間(即鎖定當前線程),並且需要您也要處理新的窗口事件,那麼您通常需要多個事件的情況通常是這樣。我能想到的兩個具體的例子:
在(1)中,這通常是你正在使用的GUI框架,而不是你必須明確做的事情。 (2)更好的處理方式是每個事件異步「做好工作」,而不是阻塞消息泵。
總之:這取決於。 :-)在大多數情況下,您不需要使用多個消息循環,但如果必須,請執行此操作!
應用程序:
本質上,當線程要創建和管理窗口。這包括支持COM STA等的「隱藏」窗口。
沒有窗口,沒有窗口消息,不需要消息循環。
服務:
服務經理需要處理的服務信息,因此需要啓動/停止/任何一種服務的消息循環。
對於在服務中啓動的其他線程,不需要消息循環。
您不需要服務中的消息循環。服務管理器會從它自己的線程調用你的OnStart/OnStop等。當然你可能需要自己的循環,但這不是必需的。 – adrianm