關於modal dialog不會凍結調用線程非GUI消息的理解.

召喚僞代碼:

代碼很簡單, 先在Wm_CREATE中創建一個Timer, 間隔2秒MessageBox,

WM_LBUTTONDOW會顯示一個DialogBox, IDD_ABOUTBOX.

 

當IDD_ABOUTBOX顯示時, 主窗口的WM_PAINT仍然響應重繪, 而MessageBox也會定時的蹦出來!

如果說主窗口的消息循環被暫時中斷, 那麼WM_PAINT和WM_TIMER就不會響應.

如果這兩個消息有響應, 主循環就沒有被凍結, 但點主窗口雜沒反應呢?

事情是這樣的:

我們知道modal dialog自帶消息循環,  當主窗口調用DialogBox時就進入了其內部的消息循環.

GetMessage的特點是從所屬線程的消息隊列裏拿消息並處理之, 而這個線程正是我們的主窗口所在的線程,

所以雖然我們的主窗口消息循環被實際凍結了但modal dialog爲我們代勞之, 主窗口的內部消息仍然有響應.

當然直接點它就沒反應拉

 

網上有很多說法雖然正確但感覺過於籠統不夠詳盡, 所以特發此帖希望對有相同困惑的朋友能有一些幫助.

高手就路過吧:P

發佈了26 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章