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

MFC的SendMessage与PostMessage的区别

一、SendMessage
同步操作: SendMessage 是一个同步函数,它会将消息发送到指定的窗口,并等待该窗口的消息处理过程完成,然后返回。这意味着它会阻塞当前线程,直到消息处理完成。

直接调用: SendMessage 会将消息直接传递给目标窗口的消息处理函数,因此消息处理函数在当前线程中执行。这可以确保消息的有序处理,但也可能导致界面冻结,如果消息处理耗时较长。

用途: 通常用于在同一应用程序内的不同窗口之间传递消息,或者用于发送和接收系统消息

二、PostMessage

异步操作: PostMessage 是一个异步函数,它会将消息放入目标窗口的消息队列中,然后立即返回。它不会等待消息处理完成。

间接调用: PostMessage 不会立即调用目标窗口的消息处理函数。消息会在目标窗口的消息队列中排队,等待目标窗口的消息循环来处理。这意味着消息处理是在目标窗口的线程上执行的。

用途: 通常用于在不同线程之间传递消息,以避免界面冻结或执行长时间运行的任务。

PostMessage是非阻塞的,直接把消息放到消息队列之中,发送函数继续执行,若是发送的参数是临时变量,将会在消息处理函数产生乱码,所以才有静态,或者全局变量避免乱码


#define TTMSG_WARNLIST1 9999
BEGIN_MESSAGE_MAP(CMFCTESTDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CMFCTESTDlg::OnBnClickedButton1)
	ON_MESSAGE(TTMSG_WARNLIST1, &CMFCTESTDlg::OnTTwarnListMsg1)
	ON_BN_CLICKED(IDC_BUTTON2, &CMFCTESTDlg::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON3, &CMFCTESTDlg::OnBnClickedButton3)
	ON_BN_CLICKED(IDC_BUTTON4, &CMFCTESTDlg::OnBnClickedButton4)
END_MESSAGE_MAP()





void CMFCTESTDlg::OnBnClickedButton3()
{
	CString str1 = _T("123");
	CString str2 = _T("hello");

	::SendMessage(this->GetSafeHwnd(), TTMSG_WARNLIST1, (WPARAM)(LPCTSTR)str1, (LPARAM)(LPCTSTR)str2); //发送消息方式1
	int m=0;
	m++;

}


void CMFCTESTDlg::OnBnClickedButton2()
{
	CString str1 = _T("123");
	CString str2 = _T("hello");

	::PostMessage(this->GetSafeHwnd(), TTMSG_WARNLIST1, (WPARAM)(LPCTSTR)str1, (LPARAM)(LPCTSTR)str2); //发送消息方式1
	int m=0;
	m++;
	// SendMessage(TTMSG_WARNLIST1, (WPARAM)(LPCTSTR)str1, (LPARAM)(LPCTSTR)str2);     //发送消息方式2
}

LRESULT  CMFCTESTDlg::OnTTwarnListMsg1(WPARAM wParam, LPARAM lParam)
{
	int mm = wParam;
	CString cstr1 = (LPCTSTR)wParam;
	CString cstr2 = (LPCTSTR)lParam;
	m_ctrlEdit.SetWindowText(cstr1+cstr2);
	return TRUE;
}


在这里插入图片描述
以上乱码,将传递参数改成全局或者静态,确保函数推出后不会回收内存即可。
参考:https://blog.csdn.net/sinat_31608641/article/details/106684808


http://www.kler.cn/a/373765.html

相关文章:

  • 100种算法【Python版】第9篇——二分法
  • 12. MapReduce全局计数器
  • Javaweb 实验4 xml
  • C#与C++交互开发系列(十七):线程安全
  • Soanrquber集成Gitlab 之 gitlab用户配置和身份验证
  • Java项目实战II基于Spring Boot的美食烹饪互动平台的设计与实现(开发文档+数据库+源码)
  • 「Mac畅玩鸿蒙与硬件3」鸿蒙开发环境配置篇3 - DevEco Studio 插件安装与配置
  • C++ | Leetcode C++题解之第516题最长回文子序列
  • 常用的关键特性
  • 心觉:抄袭是一种智慧
  • SM单元 硬件
  • 力扣227:基本计算器II
  • Java语言的Springboot框架+云快充协议1.5+充电桩系统+新能源汽车充电桩系统
  • 派生类重载的delete操作符调用时可以动态绑定吗
  • 创建一个基于SSM框架的药品商超管理系统
  • springboot响应文件流文件给浏览器+前端下载
  • redis详细教程(3.hash和set类型)
  • [TypeError]: type ‘AbstractProvider‘ is not subscriptable
  • 三项智能网联汽车强制性国家标准正式发布(附图解)
  • 应用在汽车控制系统安全气囊的爱普生可编程晶振SG-8018CG
  • SpringBoot技术:闲一品交易的新机遇
  • Java 多线程(九)—— JUC 常见组件 与 线程安全的集合类
  • ComfyUI正式版来袭!一键安装无需手动部署!支持所有电脑系统
  • 线程本地变量-ThreadLocal
  • CMake知识点
  • [LeetCode] 36. 有效的数独