博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实例说明>
阅读量:4314 次
发布时间:2019-06-06

本文共 1555 字,大约阅读时间需要 5 分钟。

首先自定义一个消息ID: UM_TEST,用于测试SendMessage和PostMessage的在发生该消息的具体区别,我们在主框架的OnCreate函数中实现该消息的测试,相关说明如下:

消息映射:

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)	ON_WM_CREATE()    ....    ON_MESSAGE(UM_TEST, &OnTest)//自定消息END_MESSAGE_MAP()
函数声明:

对于自定义的消息,其函数声明必须是LRESULT类型,第一参数是WPARAM,第二参数是LPARAM,如下所示:

afx_msg LRESULT OnTest(WPARAM wParam, LPARAM lParam);
函数实现:

LRESULT CMainFrame::OnTest(WPARAM wParam, LPARAM lParam){         MessageBox("Process Msg Sucess");    return 0;}
OnCreate消息响应函数:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)        return -1;       if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP        | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||        !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))    {        TRACE0("未能创建工具栏\n");        return -1;      // 未能创建    }    ...//中间省略    SendMessage(UM_TEST, 0, 0);    return 0;}

过程分析:

       我们首先在SendMessage()函数和return0两行分别打上断点,同时在OnTest消息响应函数体内打一个断点,F5 Debug执行代码,可以发现函数执行大致流程是:

SendMessage()->OnTest函数->SendMessage的下一句(return 0).

而如果将SendMessage改成PostMessage程序执行大致流程:

SendMessage()->SendMessage的下一句(return 0)->OnTest函数。

总结:

       从程序的执行顺序可以看出,当前程序会将SendMessage的消息处理完毕后,才会返回;而PostMessage只是将消息投递到线程的消息队列中,就立即返回。下一时刻该消息才从消息队列中取出,由对应的消息处理程序处理。

运行效果:

       对于SendMessage,如果我们不将“Process Msg Sucess”模态窗口点击确定,程序会一致阻塞在OnTest函数体内,不会往下执行;点击确定后,主框架窗口才会显示出来。

       对于PostMessage而言,主框架窗口完成显示后,提示框的窗口也显示出来了,两者有一定的先后顺序。

从执行效果上看,就可以明白SendMessage 是同步的,具有阻塞性质,而PostMessage是异步的,没有阻塞性质

转载于:https://www.cnblogs.com/jinxiang1224/p/8468355.html

你可能感兴趣的文章
c++ 模板template
查看>>
javascript中的string对象
查看>>
CString的成员函数详解
查看>>
Appium Studio 初体验(windows做ios自动化,录制appium脚本)
查看>>
学习java前端 两种form表单提交方式
查看>>
Linux常用命令
查看>>
整体二分&cdq分治 ZOJ 2112 Dynamic Rankings
查看>>
【POJ2976】Dropping tests (01分数规划入门题)
查看>>
通过正则表达式获取url中参数
查看>>
86.运算符重载
查看>>
cxx signal信号捕获
查看>>
《Android开发艺术探索》读书笔记——Cha3.2.3改变布局参数实现View的滑动
查看>>
python闭包与装饰器
查看>>
Acegi 源码解释
查看>>
Activity的几种启动跳转方式
查看>>
LCA最近公共祖先Tarjan(离线)
查看>>
牛客练习赛16 E求值
查看>>
matlab rank
查看>>
Asp.net系列--基础篇(三)
查看>>
css基础
查看>>