采用PostThreadMessage即可
BOOL PostThreadMessage(
DWORD idThread, //線程ID,通過(guò)創(chuàng)建線程后的id
UINT Msg, //消息id
WPARAM wParam,
LPARAM lParam);
然后在線程通過(guò)GetMessage or PeekMessage去獲取該消息.
代碼片段如下:
unsigned int CALLBACK thread_func(LPVOID lp)
{
while(1)
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
//while (PeekMessage(&msg, NULL, 0, 0,PM_REMOVE))
{
switch(msg.message)
{
case WM_MYMESSAGE:
printf("\n *thread_func1:%d", msg.wParam);
break;
}
}
}
}
其中發(fā)送線程片段如下:
UINT dwId
_beginthreadex(NULL, 0, thread_func, NULL, 0, &dwId);
...
附:
GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax,UINT wRemoveMsg)
參數(shù)wRemoveMsg的作用是指定消息獲取的方式,如果設(shè)為PM_NOREMOVE,那么消息將不會(huì)從消息隊(duì)列中被移出,如果設(shè)為PM_REMOVE,那么消息將會(huì)從消息隊(duì)列中被移出;
兩個(gè)函數(shù)主要有以下兩個(gè)區(qū)別:
1.GetMessage將等到有合適的消息時(shí)才返回,而PeekMessage只是撇一下消息隊(duì)列。(GetMessage 處于掛起等待消息來(lái),而PeekMessage則不管有不有消息都返回)
2.GetMessage會(huì)將消息從隊(duì)列中刪除,而PeekMessage可以設(shè)置最后一個(gè)參數(shù)wRemoveMsg來(lái)決定是否將消息保留在隊(duì)列中。(如果保留在隊(duì)列中,最好立即處理)
在Windows的內(nèi)部,GetMessage和PeekMessage執(zhí)行著相同的代碼。而兩者最大的不同之處則體現(xiàn)在沒(méi)有任何消息返回到應(yīng)用程序的情況下。在此種情況下,PeekMessage會(huì)返回一個(gè)空值到應(yīng)用程序,GetMessage會(huì)在此時(shí)讓?xiě)?yīng)用程序休眠。
(如果在線程中使用,用GetMessage or PeekMessage都無(wú)所謂,不需要考慮消息隊(duì)列的remove,消息隊(duì)列在各個(gè)線程中不過(guò)是個(gè)拷貝?而已.)
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1573835