当前位置: 首页 > news >正文

针对PostMessage和SendMessage区别的一个试验

作者:朱金灿
来源:http://blog.csdn.net/clever101/


      最近看《Win 32多线程程序设计》,书中提到了PostMessage和SendMessage的区别。PostMessage是一个异步行为,就是先把消息扔到对方的消息队列,然后沿着原调用点继续执行;SendMessage是一个同步行为,就是等待对方把这个消息处理完再回到调用点继续执行。


      我想怎么测试这个结论呢?为此我设计了一个小试验:在视图中弹出一个非模式的帮助对话框,然后分别用PostMessage和SendMessage给这个对话框发消息,消息处理函数很简单,就是在视图上打印字符串。


// 使用SendMessage给对话框发送自定义消息WM_ABOUTSENDMSG,然后打印5个"字符串来// 自视图窗口"的字符串 void CTestUnicodeView::OnTestSendmsg() { // TODO: 在此添加命令处理程序代码 int i = 0; // m_pAboutDlg为CAboutDlg类指针的变量 ::SendMessage(m_pAboutDlg->GetSafeHwnd(),WM_ABOUTSENDMSG,(WPARAM)this->GetSafeHwnd(),(LPARAM)i); CDC *pDC = GetDC(); for ( i = 0;i<5;i++) { CString str = _T("字符串来自视图窗口"); CRect rt(0,120+i*20,200,140+i*20); pDC->DrawText(str,&rt,DT_CENTER); Sleep(2000); // 睡眠2秒,可以更好看到输出 } ReleaseDC(pDC); } // 使用PostMessage给对话框发送自定义消息WM_ABOUTPOSTMSG,然后打印5个"字符串来// 自视图窗口"的字符串 void CTestUnicodeView::OnTestPostmsg() { // TODO: 在此添加命令处理程序代码 int i = 0; ::PostMessage(m_pAboutDlg->GetSafeHwnd(),WM_ABOUTPOSTMSG,(WPARAM)this->GetSafeHwnd(),(LPARAM)i); CDC *pDC = GetDC(); for ( i = 0;i<5;i++) { CString str = _T("字符串来自视图窗口"); CRect rt(0,120+i*20,200,140+i*20); pDC->DrawText(str,&rt,DT_CENTER); Sleep(2000); // 睡眠2秒,可以更好看到输出 } ReleaseDC(pDC); } // WM_ABOUTSENDMSG消息的处理函数,在视图上打印5个"字符串来自对话框窗口" LRESULT CAboutDlg::AboutSendMsg( WPARAM wp,LPARAM lp ) { HWND hView = (HWND)wp; int i = (int)lp; CTestUnicodeView *pView = dynamic_cast<CTestUnicodeView*>(CWnd::FromHandle(hView)); CDC *pDC = pView->GetDC(); for (i = 0;i<5;i++) { CString str = _T("字符串来自对话框窗口"); CRect rt(0,i*20,200,20+i*20); pDC->DrawText(str,&rt,DT_CENTER); Sleep(2000); // 睡眠2秒,可以更好看到输出 } pView->ReleaseDC(pDC); return 0; } // WM_ABOUTPOSTMSG消息处理函数,在视图上打印5个"字符串来自对话框窗口" LRESULT CAboutDlg::AboutPostMsg( WPARAM wp,LPARAM lp ) { HWND hView = (HWND)wp; int i = (int)lp; CTestUnicodeView *pView = dynamic_cast<CTestUnicodeView*>(CWnd::FromHandle(hView)); CDC *pDC = pView->GetDC(); for (i = 0;i<5;i++) { CString str = _T("字符串来自对话框窗口"); CRect rt(0,i*20,200,20+i*20); pDC->DrawText(str,&rt,DT_CENTER); Sleep(2000); // 睡眠2秒,可以更好看到输出 } pView->ReleaseDC(pDC); return 0; }


     试验结果是使用SendMessage给对话框发送消息,先是依次输出5个"字符串来自对话框窗口",再依次输出5个"字符串来自视图窗口"。而使用PostMessage给对话框发送消息,结果相反,先依次输出5个"字符串来自视图窗口",再依次输出5个"字符串来自对话框窗口"。



转载于:https://www.cnblogs.com/lanzhi/archive/2010/10/17/6470991.html

相关文章:

  • 【spring框架】beans.xml规范与ClassPathXmlApplicationContext类介绍
  • It's not a Bug, It's a Feature! --POJ 1482
  • postgresql 死锁问题解决记录
  • WCF Data Services客户端访问
  • css知多少(4)——解读浏览器默认样式
  • Breakthrough—JavaScript基础
  • 辛苦几个小时,终于装完主机了
  • 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--PS2封装(十八)
  • android httpClient 支持HTTPS的2种处理方式
  • 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇阶段总结与WinForm篇展望...
  • 如何开启常用端口和其他端口
  • C# HttpRequest基础连接已经关闭: 接收时发生意外错误
  • 学习笔记----安装nginx
  • 从零开始学android开发-查看sqlite数据库
  • 大数据的导入与导出,可以用到两个方法
  • 30天自制操作系统-2
  • Angular 2 DI - IoC DI - 1
  • centos安装java运行环境jdk+tomcat
  • Docker 笔记(2):Dockerfile
  • echarts的各种常用效果展示
  • FineReport中如何实现自动滚屏效果
  • JavaScript HTML DOM
  • php ci框架整合银盛支付
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Redis中的lru算法实现
  • Spark学习笔记之相关记录
  • Yeoman_Bower_Grunt
  • 包装类对象
  • 利用jquery编写加法运算验证码
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端学习笔记之观察者模式
  • 区块链将重新定义世界
  • 深度学习在携程攻略社区的应用
  • 双管齐下,VMware的容器新战略
  • 我的zsh配置, 2019最新方案
  • 一个完整Java Web项目背后的密码
  • 栈实现走出迷宫(C++)
  • 从如何停掉 Promise 链说起
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (分布式缓存)Redis持久化
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (简单) HDU 2612 Find a way,BFS。
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (转)c++ std::pair 与 std::make
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .bat批处理出现中文乱码的情况
  • .net Application的目录
  • .NET 发展历程
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 流——流的类型体系简单介绍
  • .NET处理HTTP请求