windows下,每個執行緒都可以擁有乙個訊息佇列,通常ui執行緒預設就擁有自己的訊息佇列,work thread需要自己呼叫peekmessage來建立自己的訊息佇列。
訊息是乙個資料結構,下面是它的定義:
typedef
struct tagmsg msg
每個訊息都包含了要接收訊息的視窗的控制代碼,訊息id,兩個引數,還有其他資訊。sdk下的訊息迴圈通常這樣寫:
while
(getmessage(&msg, null, 0, 0))
} 除非getmessage函式從訊息佇列中獲取到了wm_quit訊息,否則這個迴圈將永遠進行下去。迴圈內部先對加速鍵和鍵盤訊息進行處理,然後傳送該訊息到指定視窗,因為訊息本身包含了視窗的控制代碼,所以目的地不用再明確指定。
當目標視窗接收到訊息後,視窗過程函式就會被執行,根據不同的訊息進行相應的處理。
因為視窗過程函式和視窗類名在註冊視窗的時候建立了對應關係。建立視窗時,我們又使用了視窗類名,所以可以推測建立成功後獲得的視窗控制代碼和視窗過程函建立了對映。
下面是乙個典型的視窗過程函式:
lresult callback wndproc(hwnd hwnd, uint message, wparam wparam, lparam lparam)
break;
case wm_paint:
hdc = beginpaint(hwnd, &ps);
// todo: add any drawing code here...
endpaint(hwnd, &ps);
break;
case wm_destroy:
postquitmessage(0);
break;
default:
return defwindowproc(hwnd, message, wparam, lparam); }
return 0; }
Android 執行緒訊息迴圈機制
looper用於封裝了android執行緒中的訊息迴圈,預設情況下乙個執行緒是不存在訊息迴圈 message loop 的,需要呼叫looper.prepare 來給執行緒建立乙個訊息迴圈,呼叫looper.loop 來 使訊息迴圈起作用,從訊息佇列裡取訊息,處理訊息。注 寫在looper.loop...
詳談Windows訊息迴圈機制
一直對windows訊息迴圈不太清楚,今天做個詳細的總結,有說錯的地方,請務必指出。程式入口 intwinapi winmain 定義視窗類 typedef struct tagwndclassa 註冊視窗類 registerclass wndclass 生成視窗 createwindow 更新視窗...
SDK中的訊息分解
在sdk中經常會響應許多訊息,這樣大量 在case 中,格式比較難看.以下是訊息分解的例子.include 訊息分解,在中定義有巨集handle msg,例如 handle msg hwnd,wm command,command handle msg hwnd,wm create,create ha...