亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1835 | 回復(fù): 0
打印 上一主題 下一主題

SendMessage、PostMessage [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2013-06-28 17:11 |只看該作者 |倒序?yàn)g覽
SendMessage、PostMessage兩個(gè)函數(shù)的實(shí)現(xiàn)原理,

(1)、SendMessage、PostMessage的運(yùn)行機(jī)制

SendMessage可以理解為,SendMessage函數(shù)發(fā)送消息,等待消息處理完成后,SendMessage才返回。稍微深入一點(diǎn),是等待窗口處理函數(shù)返回后,SendMessage就返回了。

PostMessage可以理解為,PostMessage函數(shù)發(fā)送消息,不等待消息處理完成,立刻返回。稍微深入一點(diǎn),PostMessage只管發(fā)送消息,消息有沒有被送到則并不關(guān)心,只要發(fā)送了消息,便立刻返回。

對(duì)于寫一般Windows程序的程序員來說,能夠這樣理解也就足夠了。但SendMessage、PostMessage真的是一個(gè)發(fā)送消息等待、一個(gè)發(fā)送消息不等待嗎?具體細(xì)節(jié),下面第2點(diǎn)將會(huì)講到。


(2)、SendMessage、PostMessage的運(yùn)行內(nèi)幕

在MSDN中,SendMessage解釋如為:The SendMessage function sends the specified message to a window or windows. It calls the window procedure for the specified window and does not return until the window procedure has processed the message.

翻譯成中文為:SendMessage函數(shù)將指定的消息發(fā)到窗口。它調(diào)用特定窗口的窗口處理函數(shù),并且不會(huì)立即返回,直到窗口處理函數(shù)處理了這個(gè)消息。

再看看PostMessage的解釋:The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.

    翻譯成中文為:PostMessage函數(shù)將一個(gè)消息放入與創(chuàng)建這個(gè)窗口的消息隊(duì)列相關(guān)的線程中,并立刻返回不等待線程處理消息。

仔細(xì)看完MSDN解釋,我們了解到,SendMessage的確是發(fā)送消息,然后等待處理完成返回,但發(fā)送消息的方法為直接調(diào)用消息處理函數(shù)(即WndProc函數(shù)),按照函數(shù)調(diào)用規(guī)則,肯定會(huì)等消息處理函數(shù)返回之后,SendMessage才返回。而PostMessage卻沒有發(fā)送消息,PostMessage是將消息放入消息隊(duì)列中,然后立刻返回,至于消息何時(shí)被處理,PostMessage完全不知道,此時(shí)只有消息循環(huán)知道被PostMessage的消息何時(shí)被處理了。

至此我們撥開了一層疑云,原來SendMessage只是調(diào)用我們的消息處理函數(shù),PostMessage只是將消息放到消息隊(duì)列中。下一節(jié)將會(huì)更深入這兩個(gè)函數(shù),看看Microsoft究竟是如何實(shí)現(xiàn)這兩個(gè)函數(shù)的。


(3)、SendMessage、PostMessage的內(nèi)部實(shí)現(xiàn)


首先,在基本W(wǎng)in32工程代碼中,我們可以直接看到消息處理函數(shù)、消息循環(huán),所以建立一個(gè)基本W(wǎng)in32工程(本篇文章使用VS2005),為了看到更多信息,我們需要進(jìn)行設(shè)置,讓VS2005載入Microsoft的Symbol(pdb)文件[1]。為了方便,去除了一些多余的代碼,加入了兩個(gè)菜單,ID分別為:IDM_SENDMESSAGE、IDM_POSTMESSAGE。如下列出經(jīng)過簡(jiǎn)化后的必要的代碼。

Ln000:while (GetMessage(&msg, NULL, 0, 0))

Ln001:{

Ln002:    TranslateMessage(&msg);

Ln003:    DispatchMessage(&msg);

Ln004:}



消息處理函數(shù):

Ln100:LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

Ln101:{

Ln102:    int wmId, wmEvent;

Ln103:    switch (message)

Ln104:    {

Ln105:    case WM_COMMAND:

Ln106:        wmId = LOWORD(wParam);

Ln107:        wmEvent = HIWORD(wParam);

Ln108:        switch (wmId)

Ln109:        {

Ln110:        case IDM_EXIT:

Ln111:            DestroyWindow(hWnd);

Ln112:            break;

Ln113:        case IDM_SENDMESSAGE:

Ln114:            SendMessage(hWnd, WM_SENDMESSAGE, 0, 0);

Ln115:            break;

Ln116:        case IDM_POSTMESSAGE:

Ln117:            PostMessage(hWnd, WM_POSTMESSAGE, 0, 0);

Ln118:            break;

Ln119:        default:

Ln120:            return DefWindowProc(hWnd, message, wParam, lParam);

Ln121:        }

Ln122:        break;

Ln123:

Ln124:    case WM_SENDMESSAGE:

Ln125:        MessageBox(hWnd, L"SendMessage", L"Prompt", MB_OK);

Ln126:        break;

Ln127:

Ln128:    case WM_POSTMESSAGE:

Ln129:        MessageBox(hWnd, L"PostMessage", L"Prompt", MB_OK);

Ln130:        break;

Ln131:

Ln132:    case WM_DESTROY:

Ln133:        PostQuitMessage(0);

Ln134:

Ln135:    default:

Ln136:        return DefWindowProc(hWnd, message, wParam, lParam);

Ln137:    }

Ln138:    return 0;

Ln139:}

您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP