對執行緒間SendMessage的解疑

2022-09-10 18:45:12 字數 1049 閱讀 5650

上面說過執行緒內sendmessage只是簡單的呼叫指定視窗的視窗過程。

而執行緒間sendmessage時,傳送執行緒不可能直接呼叫目標視窗的視窗過程,因為傳送執行緒無法執行在接收執行緒的位址空間中。因此實際過程是傳送執行緒掛起,然後由另外的執行緒處理訊息。過程是:

首先傳送的訊息被追加到接收執行緒的傳送訊息佇列中(send-message queue),並設定執行緒的qs_sendmessage標誌。這個佇列跟郵遞訊息佇列(post-message queue,即之前所謂的訊息佇列)是並列的,之間沒有關係。另外還有乙個應答訊息佇列(reply-message queue),這在後面會用到。

之後,如果接收執行緒已經在執行其它**,則暫時不會處理該訊息。當接收執行緒進入等待訊息時(如呼叫getmessage、peekmessage或waitmessage),windows系統首先檢查執行緒的qs_sendmessage喚醒標誌是否設定,如果設定,則系統掃瞄傳送訊息佇列中訊息的列表,並找到第乙個傳送的訊息。

當接收執行緒等待訊息時,系統從傳送訊息佇列中取出第乙個訊息並呼叫相應的視窗過程來處理訊息。如果傳送訊息佇列中不再有訊息,則qs_sendmessage被關閉。當接收執行緒處理訊息時,呼叫sendmessage的執行緒設定成idle狀態,並等待乙個訊息出現在它的應答訊息佇列中。在傳送的訊息處理之後,視窗過程的返回值等級到傳送執行緒的應答訊息佇列中。傳送執行緒被喚醒,取出包含映帶訊息佇列中的返回值,即sendmessage的返回值。然後傳送執行緒繼續執行。

當執行緒等待sendmessage返回時,基本時處於idle狀態。但當其它執行緒向該執行緒的視窗傳送訊息時,系統要立即處理訊息,而不用象前一段說過的等待執行緒呼叫getmessage、peekmessage或waitmessage時才處理執行緒間的send訊息。

雖然執行緒間的非佇列(send)訊息也是傳送的佇列中的,但與post訊息有兩個主要區別:

1.佇列不同,分別是send-message queue和post-messag queue。

2.獲取訊息途徑不同。post型訊息是接收執行緒通過getmessage獲得的;而send型訊息則是通過系統從佇列中提取,然後呼叫該訊息的對應視窗進行執行,這個過程在接收執行緒等待訊息時才執行。

程序間通訊SendMessage

postmessage貌似只能用於程序內通訊,不同程序間通訊可以用sendmessage和共享記憶體等方式。這裡理出sendmessage的用法,方便日後查閱。傳送訊息的程序 char sztemp 1024 sprintf sztemp,layeredwindow d iwndid 視窗名 hwn...

執行緒 對執行緒的控制

使用thread建立執行緒後,我們需要對執行緒進行 控制 1.使用start 方法,使執行緒處於running狀態,執行緒開始執行 2.使用join 方法,使執行緒進入waitsleepjoin狀態。3.使用sleep 方法,也會使執行緒進入waitsleepjoin狀態。經歷了sleep 方法定義...

對執行緒的總結

一 建立執行緒 重點1 繼承 thread 2 實現 runnable 知識點 其中用到了設計模式中的 模式,角色 持有真實角色的引用。引申到aop,就是用的動態 3 實現 callable 了解 二 執行緒的狀態 1 新生 start 就緒 執行 阻塞 終止2 終止執行緒 重點 3 阻塞 join...