眾所周知,一般windows程式的運行機制是,先創建一個訊息列隊,然后通過getmessage(hwnd,,,,)這個函式從列隊中取出訊息,再一次處理。從getmessage(hwnd,,,,)這個函式中可以看到,程式是從某一個特定的視窗中取出訊息的。難道這就說明了,訊息列隊是屬于視窗的,程式會為每一個視窗都創建一個訊息列隊???當系統產生了屬于此程式的訊息時,就把此訊息發送到該程式的訊息列隊中???
還是說,訊息列隊是屬于執行緒的,執行緒先創建一個主視窗,然后創建一個執行緒訊息列隊,系統將訊息發送到該執行緒列隊中,然后依次處理訊息???
哎!對這些執行緒視窗訊息列隊不了解啊,關系好復雜,求大神指點迷津啊!!!
uj5u.com熱心網友回復:
Windows 有個公共訊息佇列。訊息先在此處排隊,然后逐一放入執行緒訊息佇列,而不是視窗訊息佇列(視窗其實沒有訊息佇列)。如果你的應用只有一個主執行緒,那么,你獲得的訊息全都進入此執行緒的訊息佇列。如果還有子執行緒也創建了視窗,該子執行緒也會有單獨的訊息佇列。這就是說,訊息是和執行緒對應,而不是和視窗對應,雖然每條訊息都有一個 handle 標記特定的視窗。這應該不難理解。Windows 運行模式就是訊息驅動。每個應用啟動后,就是一個或多個執行緒在那里不停運轉,隨時檢查自己的佇列里是否有訊息到來。沒訊息就在那里空轉等待,有訊息就去處理,然后繼續等待。所以,訊息必須歸執行緒管轄,而不是歸視窗管轄。
uj5u.com熱心網友回復:
訊息佇列屬于視窗,不屬于執行緒;視窗不屬于執行緒,執行緒也不一定有視窗。就這么簡單。uj5u.com熱心網友回復:
但是如果在一個程式中我創建多個視窗的話,從getmessage(hwnd,,,)這個函式來看的話,其中的引數hwnd應該是哪一個視窗呢??而且,若是列隊屬于執行緒的話,那么getmessage函式與視窗應該沒關系啊!!為什么要有hwnd這個引數呢??uj5u.com熱心網友回復:
你的應用創建視窗時都會得到一個 hwnd,用來區別視窗,所以你應該知道哪個視窗對應哪個 hwnd。要想取出所有視窗的訊息,可以把這個引數設定成 NULL。你獲得的 MSG 結構中會有 hwnd 指明是哪個視窗的訊息,后續代碼就可以針對特定視窗完成與訊息對應的操作。例如,這是個鍵盤訊息,你就要根據 hwnd 完成對應視窗的鍵盤輸入操作。uj5u.com熱心網友回復:
好冷清啊,擼過蹭分
uj5u.com熱心網友回復:
windows訊息佇列有兩種,一種是視窗的,另一種是執行緒的,執行緒的訊息佇列要有一個建立的程序。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/156802.html
標籤:基礎類
上一篇:matlab問題4:批量匯入txt后如何進行計算,textread;輸出每個檔案1,4行資料和計算所得平均值如何實作
