关于windows消息机制的猜想
1.
正常情況下一個進程里面只有一個主線程而已。
主線程負責消息的讀取和分析分發。
消息是保存在消息隊列里面,消息隊列是跟線程相關的。每一個線程都有一個消息隊列(工作線程默認沒有,但是隨便給他發送一個消息,或線程內調用getmessage函數,系統會自動給它生產一個消息隊列的)。程序執行邏輯就是,線程不斷的從隊列里面取消息GetMessage,分析處理TranslateMessage,然后派發DispathMessage——就是調用消息對應的窗口處理函數而已。(非綁定窗口的消息,再說)。
任何一個窗口都是跟線程相關的,也就是任何一個HWND句柄,都有所屬的線程。故,不管是進程內還是進程外向某窗口發消息,此消息都會進入那個窗口所在線程的消息隊列,由線程派發給那個窗口過程執行。
對于MODAL對話框,其消息獲取循環是窗口自己的(就是while的那段代碼),但其實獲取的消息還是線程所屬的消息隊列數據,只是為了實現modal效果,所以由窗口過程來實現消息獲取派發,以過濾阻塞對下層窗口的消息派發,(這個效果也可以由主ui線程來完成,不過,那樣會更加復雜,故MFC將modal模式對話框的實現效果,放在了cdialog里面去實現的)。
2.
消息循環和多線程不是一一對應的,消息就是一個棧,每個窗口都有自己的消息棧,操作系統會不停取消息出來處理,如果沒有消息則等待消息入棧。這個就是消息循環。
不同窗口的消息處理其實只是處理器如何分配資源給各個窗口而已,畢竟窗口消息不是一直占用著cpu的。你可以理解為cpu處理了a窗口,然后讓a窗口等待,再去處理b窗口。只是這種切換很快,你根本感覺不到a有等待過。
3.
除了模態對話框其他窗口都沒有消息循環,只有窗口函數,窗口函數處理消息但它沒有循環,窗口函數是被DispatchMessage調用的,DispatchMessage是你在消息循環調用了,其實可以這么說窗口函數是消息循環的一部分。
總結
以上是生活随笔為你收集整理的关于windows消息机制的猜想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决:Exception in thre
- 下一篇: 对于windows消息机制的体会和理解小