訊息和訊息佇列

2021-06-17 23:25:59 字數 2264 閱讀 9960

在傳統的c

程式當中,我們呼叫

fopen

函式開啟檔案,這個庫函式最終呼叫作業系統(提供的函式)來開啟檔案。而在

windows

中,不僅使用者程式可以呼叫系統的

api函式,反回來,系統也會呼叫使用者程式,這個呼叫是通過訊息來進行的。

windows程式設計是一種完全不同於傳統的

dos方式的程式設計方法。他是一種事件驅動方式的程式設計模式,主要是基於訊息的。例如,當使用者在視窗畫圖的時候,按下滑鼠左鍵,此時作業系統就會感知到這一事件,於是將這個事件包裝成乙個訊息,投遞到應用程式的訊息佇列中,然後應用程式從訊息佇列中取出訊息並進行響應。在這個處理過程中,作業系統也會給應用程式「傳送訊息」。所謂傳送訊息,實際上是作業系統呼叫程式中乙個專門負責處理訊息的函式,這個函式稱為視窗函式。

1.訊息

在windows

程式中,訊息是由

msg結構體表示的。

msg結構體定義如下:

typedef struct tagmsgmsg;

該結構體中個成員變數的含義如下:

第乙個成員變數hwnd

表示訊息所屬的視窗。我們開發的應用程式一般都是視窗應用程式,乙個訊息一般都是與乙個視窗相關聯的。例如某個活動視窗中按下滑鼠左鍵,產生的按鍵訊息就是發給該視窗的。在

windows

應用程式中,用

hwnd

的變數來標識視窗。

第二個成員變數message 

指定了訊息的識別符號。在

windows

中,訊息是由乙個數值來表示的,不同的訊息對應於不同的數值。但是由於數值不便於記憶,所以

windows

將訊息對應的數值定義為

wm_***

巨集(wm 

是window message

的縮寫)的形式,

***對應某種訊息的英文拼寫的大寫形式。例如,滑鼠左鍵暗笑的訊息是

wm_lbuttondown,

鍵盤按下的訊息是

wm_keydown,

字元訊息是

wm_char ,

等等。在程式中我們通常都是以

wm_***

巨集的形式來使用訊息的。如果想知道

wm_***

訊息對應的具體數值,可以在

visual c++ 

開發環境中選中 

wm_***. 

然後單擊滑鼠右鍵,在彈出選單中選擇

goto definition 

,即可看到該巨集的具體定義。跟蹤或檢視某個變數的定義,都可以使用這個方法。

第三、第四個成員變數wparam

和iparam

,用於指定訊息的附加訊息。例如,當我們收到乙個字元訊息的時候,

message

成員變數的值就是

wm_char,

但使用者到底輸入的是什麼字元,那麼就由

wparam

和iparam

來說明了,

wparam

和iparam

表示的資訊隨訊息的不同而不同。如果想知道這兩個成員變數具體表示什麼意思,可以在

msdn

中關於某個具體訊息的說明文件檢視到。通過

vc++

開發環境中的

goto definition 

檢視一下

wparam

和 lparam

這兩種型別的定義,可以發現這兩種型別實際就是

unsigned int 

和long 

最後兩個變數分別表示訊息投遞到訊息佇列中的時間和滑鼠的當前位置。

2.訊息佇列

每乙個windows

應用程式開始執行之後,系統都會為該應用程式建立乙個訊息佇列,這個訊息佇列用來存放該應用程式建立的視窗的訊息。例如,當我按下滑鼠左鍵的時候,就會產生

wm_lbuttondown

訊息,系統就會將這個訊息放到視窗所屬的應用程式的訊息佇列中,,等待應用程式的處理。

windows

將產生的訊息依次放到訊息佇列中,而應用程式則通過乙個訊息迴圈不斷的從訊息佇列中取出訊息,並進行效應。這種訊息機制,就是

windows

程式的執行機制。

3 進隊訊息和不進隊訊息

windows程式中的訊息可以分為進隊訊息和不進隊訊息。進隊訊息將由系統放入到應用程式的訊息佇列中,然後由應用程式取出並傳送。不進隊訊息在系統呼叫視窗過程中直接傳送給視窗。不管是進隊訊息還是不進隊訊息,最終都由系統呼叫視窗過程函式對訊息進行處理。

訊息佇列 訊息佇列

輪詢排程 一次性分發所有訊息,保證訊息平均分配,不管消費者是否能正常消費 訊息應答 保證消費端能確實消費,不丟失 公平 乙個乙個分發所有訊息,在保證分發到的執行緒確認回覆後,才分發下個訊息給下個空閒的消費者,訊息持久化 保證佇列中的訊息不丟失,包括3要素 交換器 訊息佇列 訊息都必須宣告持久化 發布...

訊息佇列 訊息佇列 kafka

kafka是乙個分布式的基於發布 訂閱模式的訊息佇列,主要用於大資料實時處理領域。要理解kafka首先要有分布式的概念,要有訊息佇列的概念。分布式系統最大的優勢就是解耦和削峰,這種情況下,a系統生成了乙個訊息,b系統非同步獲取,那麼就需要乙個存放訊息的訊息佇列 mq 相比較傳統的訊息佇列,訊息被消費...

訊息佇列 訊息複製

訊息複製需要解決 高效能,高可用,資料一致性 高效能 寫的副本越多,寫的效能越低,讀取不影響 資料一致性,必須採用主從模式的複製方式,同時需要保證在任何時刻,集群的主節點不能超過乙個。高可用 在主節點宕機後,可以盡快選出新的主節點 一 rocketmq 1 傳統複製 複製的基本單位是broker,也...