天天看點

視窗圖形系統的兩種事件消息實作機制

1、消息隊列(同步擷取消息,主動查詢)

分為總消息隊列和窗體消息隊列兩種:

一、系統總消息隊列

從輸入裝置擷取使用者的各種操作,生成總消息隊列。

二、應用(窗體,包括子窗體和控件,下面統稱應用)消息隊列

每個應用都有一個自己的消息隊列,應用根據需要向總消息隊列注冊自己需要的消息事件,然後總消息隊列根據一定的算法(包括各種事件消息的處理機制,活動應用,窗體處理等)得到最終需要分發的應用,然後将總消息隊列中的消息分發到剛剛得到的應用對應的消息隊列中。

每個應用都有一個自己消息循環,包括主動向窗體消息隊列擷取消息,分發消息,處理消息。

應用擷取消息的時候有兩種情況:

自己的消息隊列中有消息,然後擷取,分發,處理,再次擷取。

自己的消息隊列中暫時沒有消息,阻塞等待消息隊列有消息事件,這裡不存在逾時,消息隊列中新增了消息,喚醒剛剛阻塞的擷取消息線程,繼續擷取消息,然後分發,處理,再次擷取。

2、事件注冊(異步擷取消息,被動通知)

系統有一個總的事件表,每個表項對應一個事件,同時每個表項下面挂一個連結清單,這個連結清單是由注冊這個消息事件的所有應用組成。當消息事件到來時,根據一定的算法得到連結清單中最終需要通知的應用,然後通知,應用得到通知到再進一步分發、處理。

以上都是個人了解,如有不對和偏差希望大家多多指教,同時講的也比較簡單,具體實作過程要比說的複雜的多,而且有很多情況需要考慮進去,這裡僅僅是說了一個原理和大概。

繼續閱讀