1. 程式人生 > >windows 訊息機制、視窗過程與執行緒間訊息傳遞

windows 訊息機制、視窗過程與執行緒間訊息傳遞

按照自己的理解好好整理一遍


訊息機制

windows是一個訊息驅動的系統,會有一個總的系統訊息的佇列,滑鼠、鍵盤等等都會流入到這個佇列中,同時會為每個執行緒維護一個訊息佇列(注意預設是有GUI呼叫的執行緒才有,對於沒有GUI或者視窗的執行緒,只有當線上程內呼叫get/peek message 才會自動建立一個訊息佇列),執行緒是容納訊息佇列的基本單元,系統會把屬於不同執行緒的訊息投遞到屬於執行緒的訊息佇列中

當執行緒呼叫get/peek message時會從系統的訊息佇列中取出一個本執行緒內的訊息。(get方法是阻塞的會等到一個訊息拿出來為止,取到後會從佇列中移除,而peek方法只是快速的檢視一下,有取出沒有返回,並且可以選擇取到後是否從佇列中移除。)

對於有視窗的執行緒,在取出message後通常呼叫dispatchmessage將其推送給這個執行緒的視窗過程函式WndProc上,通常我們在WndProc函式裡面響應不同視窗對訊息的處理,WndProc是我們在建立視窗時必須指定的。而沒有視窗的執行緒,預設沒有訊息佇列,但是你呼叫Get/Peek message會自動建立一個,並得到這個執行緒的訊息。

執行緒間訊息傳遞

通常執行緒將訊息傳遞是程序間通訊最重要的方式,執行緒間訊息傳遞有兩種API:

PostThreadMessage :直接傳送給目標執行緒 這是對於那些不是發給某個視窗的訊息

PostMessage:傳送給某個執行緒下的某個視窗