Posted on 2008-01-02 19:35
hongsion 閱讀(2077)
評(píng)論(5) 編輯 收藏 引用 所屬分類(lèi):
Windows
以下內(nèi)容完全把window 操作系統(tǒng)當(dāng)作一個(gè)黑盒,因此所有內(nèi)容只能作為對(duì)其內(nèi)部的一個(gè)猜測(cè)。
1. windows操作系統(tǒng)內(nèi)部在創(chuàng)建一個(gè)線(xiàn)程的時(shí)候,會(huì)自動(dòng)為它創(chuàng)建一個(gè)消息隊(duì)列。
2.每當(dāng)一個(gè)線(xiàn)程創(chuàng)建一個(gè)窗口的時(shí)候,操作系統(tǒng)內(nèi)部都會(huì)把該窗口的Handle和線(xiàn)程相關(guān)聯(lián)。很有可能在操作系統(tǒng)內(nèi)部會(huì)維護(hù)一個(gè)窗口handle到線(xiàn)程的map. 還有一種可能就是窗口的成員變量里面有一個(gè)指針,指向創(chuàng)建它的線(xiàn)程。
3.窗口本身并沒(méi)有消息隊(duì)列,所有發(fā)到窗口的消息,都會(huì)自動(dòng)被發(fā)到創(chuàng)建該窗口的線(xiàn)程的消息隊(duì)列中。
4.每個(gè)線(xiàn)程只能處理自己線(xiàn)程隊(duì)列里面的消息,不能處理其他線(xiàn)程消息隊(duì)列里面的消息。
所以PeekMessage(LPMSG lpMsg, HWND hWnd, UINT,UINT,UINT)函數(shù)中,如果hWnd不是本線(xiàn)程創(chuàng)建的窗口,則該函數(shù)調(diào)用失敗。
5.由于在線(xiàn)程消息隊(duì)列里面的消息會(huì)包含有窗口句柄,所以PeekMessage可以專(zhuān)門(mén)處理某個(gè)特殊窗口的消息。
6. 曾經(jīng)有疑問(wèn)線(xiàn)程是不是只有創(chuàng)建了窗口才具有消息隊(duì)列,但又覺(jué)得應(yīng)該不是這樣,因?yàn)樵趙indows的API里面有個(gè)函數(shù)叫PostThreadMessage,可以直接把消息投遞到線(xiàn)程的消息隊(duì)列里面,而不需要任何窗口句柄。后來(lái)在MSDN里面有這么一段描述,覺(jué)得解釋的很詳細(xì):
“The system maintains a single system message queue and one thread-specific message queue for each graphical user interface (GUI) thread. To avoid the overhead of creating a message queue for non–GUI threads, all threads are created initially without a message queue. The system creates a thread-specific message queue only when the thread makes its first call to one of the User or Windows Graphics Device Interface (GDI) functions".
這里唯一的疑問(wèn)我想應(yīng)該是”makes its first call to one of the User or Windows Graphics Device Interface (GDI) functions", 這句話(huà)的意思是不是等同于創(chuàng)建一個(gè)窗口呢?