天天看點

windows 消息機制、視窗過程與線程間消息傳遞

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

windows 消息機制、視窗過程與線程間消息傳遞

消息機制

windows是一個消息驅動的系統,會有一個總的系統消息的隊列,滑鼠、鍵盤等等都會流入到這個隊列中,同時會為每個線程維護一個消息隊列(注意預設是有gui調用的線程才有,對于沒有gui或者視窗的線程,隻有當線上程内調用get/peek message 才會自動建立一個消息隊列),線程是容納消息隊列的基本單元,系統會把屬于不同線程的消息投遞到屬于線程的消息隊列中

當線程調用get/peek message時會從系統的消息隊列中取出一個本線程内的消息。(get方法是阻塞的會等到一個消息拿出來為止,取到後會從隊列中移除,而peek方法隻是快速的檢視一下,有取出沒有傳回,并且可以選擇取到後是否從隊列中移除。)

對于有視窗的線程,在取出message後通常調用dispatchmessage将其推送給這個線程的視窗過程函數wndproc上,通常我們在wndproc函數裡面響應不同視窗對消息的處理,wndproc是我們在建立視窗時必須指定的。而沒有視窗的線程,預設沒有消息隊列,但是你調用get/peek message會自動建立一個,并得到這個線程的消息。

線程間消息傳遞

通常線程将消息傳遞是程序間通信最重要的方式,線程間消息傳遞有兩種api:

postthreadmessage :直接發送給目标線程 這是對于那些不是發給某個視窗的消息

postmessage:發送給某個線程下的某個視窗

繼續閱讀