windows 訊息機制、視窗過程與執行緒間訊息傳遞
阿新 • • 發佈:2019-02-12
按照自己的理解好好整理一遍
訊息機制
windows是一個訊息驅動的系統,會有一個總的系統訊息的佇列,滑鼠、鍵盤等等都會流入到這個佇列中,同時會為每個執行緒維護一個訊息佇列(注意預設是有GUI呼叫的執行緒才有,對於沒有GUI或者視窗的執行緒,只有當線上程內呼叫get/peek message 才會自動建立一個訊息佇列),執行緒是容納訊息佇列的基本單元,系統會把屬於不同執行緒的訊息投遞到屬於執行緒的訊息佇列中
當執行緒呼叫get/peek message時會從系統的訊息佇列中取出一個本執行緒內的訊息。(get方法是阻塞的會等到一個訊息拿出來為止,取到後會從佇列中移除,而peek方法只是快速的檢視一下,有取出沒有返回,並且可以選擇取到後是否從佇列中移除。)
對於有視窗的執行緒,在取出message後通常呼叫dispatchmessage將其推送給這個執行緒的視窗過程函式WndProc上,通常我們在WndProc函式裡面響應不同視窗對訊息的處理,WndProc是我們在建立視窗時必須指定的。而沒有視窗的執行緒,預設沒有訊息佇列,但是你呼叫Get/Peek message會自動建立一個,並得到這個執行緒的訊息。
執行緒間訊息傳遞
通常執行緒將訊息傳遞是程序間通訊最重要的方式,執行緒間訊息傳遞有兩種API:
PostThreadMessage :直接傳送給目標執行緒 這是對於那些不是發給某個視窗的訊息
PostMessage:傳送給某個執行緒下的某個視窗