windows 消息機製、窗口過程與線程間消息傳遞
按照自己的理解好好整理一遍
消息機製
windows是一個消息驅動的係統,會有一個總的係統消息的隊列,鼠標、鍵盤等等都會流入到這個隊列中,同時會為每個線程維護一個消息隊列(注意默認是有GUI調用的線程才有,對於沒有GUI或者窗口的線程,隻有當在線程內調用get/peek message 才會自動創建一個消息隊列),線程是容納消息隊列的基本單元,係統會把屬於不同線程的消息投遞到屬於線程的消息隊列中
當線程調用get/peek message時會從係統的消息隊列中取出一個本線程內的消息。(get方法是阻塞的會等到一個消息拿出來為止,取到後會從隊列中移除,而peek方法隻是快速的查看一下,有取出沒有返回,並且可以選擇取到後是否從隊列中移除。)
對於有窗口的線程,在取出message後通常調用dispatchmessage將其推送給這個線程的窗口過程函數WndProc上,通常我們在WndProc函數裏麵響應不同窗口對消息的處理,WndProc是我們在創建窗口時必須指定的。而沒有窗口的線程,默認沒有消息隊列,但是你調用Get/Peek message會自動建立一個,並得到這個線程的消息。
線程間消息傳遞
通常線程將消息傳遞是進程間通信最重要的方式,線程間消息傳遞有兩種API:
PostThreadMessage :直接發送給目標線程 這是對於那些不是發給某個窗口的消息
PostMessage:發送給某個線程下的某個窗口
最後更新:2017-04-04 07:03:45