线程中使用UpdateData出错解决方法

liuxin-线程调用Updatedata函数出错的解决办法 l  问题描述          Tcp网络通信中,服务器端接收到来自客户端的连接请求并成功的建立连接,当收到来自客户端的数据时,对数据进行解析,并实现对应操作,有需要的话将在对话框中显示相应信息。通信过程中,在服务器端建立了三个线程完成主要工作,一个监听连接请求线程,另两个为来自两个客户端的数据接收监听。在接收数据解析时,将信息显示到编辑框时报错,(在线程中调用printfMsg()就出错,其 阅读详情


原文链接:http://www.cnblogs.com/lebronjames/archive/2011/02/16/1956029.html



最近写一个程序,需要在自己创建的工作线程中更新窗口数据。在使用UpdataData(false)来实现时,总是报错,在网上搜了一下,才知道在工作线程中不能使用UpdateData来更新主线程中的数据。界面的东西,最好就是用主线程(界面线程)去执行相应的操作。要想在子线程(工作线程)里执行界面线程的操作,最好是向主线程发送消息。因为MFC的CWnd用到了TLS,所以不是线程安全的。

解决办法:
1.定义一个消息 #define WM_UPDATE_MESSAGE (WM_USER+200)
2.定义消息映射
BEGIN_MESSAGE_MAP(CCServerDlg, CDialog)
//{{AFX_MSG_MAP(CCServerDlg)
...
ON_MESSAGE(WM_UPDATE_MESSAGE, OnUpdateMessage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
3. 定义消息处理函数
// Generated message map functions
//{{AFX_MSG(CCServerDlg)
...
afx_msg LRESULT OnUpdateMessage(WPARAM wParam, LPARAM lParam); 

//}}AFX_MSG
DECLARE_MESSAGE_MAP()
4. 完成函数内容,只需调用UpdateData()即可
LRESULT CXXXDlg::OnUpdateMessage(WPARAM wParam, LPARAM lParam)
{
UpdateData(false);
return 0;
}
5.线程中的调用
UINT CXXXDlg::ClientThread(LPVOID lpParam)
{
CXXXDlg *pt=(CCServerDlg*)CWnd::FromHandle(((CCServerDlg*)lpParam)->m_hWnd);//get the handle to post message
pt->PostMessage(WM_UPDATE_MESSAGE,0,0);//OK - UpdateDate
//message sended to "pt"
...

}

6.程序中调用
// CWinThread* pThread;
// static UINT ClientThread(LPVOID lpParm);
void CCServerDlg::OnSStart() 
{
...
pThread=AfxBeginThread(ClientThread,this);
...
}

VS2022离线环境下的NuGet包管理:从本地源到依赖项全解析 本文详细解析了在VS2022离线环境下如何高效管理NuGet包,包括搭建本地NuGet源的两种方案(本地文件夹源和私有NuGet服务器)、获取离线包的三大渠道以及依赖项处理的实战技巧。通过自动化脚本和依赖树分析工具,帮助开发者解决离线环境中的依赖项黑洞问题,提升开发效率。 阅读详情

相关推荐

星网锐捷语音网关密码重置恢复出厂设置

星网锐捷语音网关---密码重置 第一种星网锐捷SVX网关恢复出厂设置的方法 eth1口 任意口插网线,连接电脑并设置电脑固定ip为: 一, 二 网页输入: 192.168.88.86 admin 默认密码 admin 登陆。 忘记密码 可通过以下方法重置: 三: 通过crt或者 shell工具 ,连接 root@192.168.88.86 连续输入两次 passwd a12345678 reboot重启后。通过账号 密码 a12345678 即可登陆系...

cibazhanji2176的博客 1万+

在vc6线程中如何更新窗口数据

在vc6中如果在线程中用Update跟新主线程的数据,就会出错。错误如下:由于自己做的一款软件 遇到这个问题 所以在总结下 希望能为遇到同类问题的朋友,提供方便,节省时间。总结解决的方法有如下三个:一、定义自定的UpdateData消息具体如下:1、在主窗体头文件中用下列函数注册windows消息const UINT WM_UPDATEDATA = ::Regi

renshk的专栏 1160

STM32 HAL库下DHT22高精度温湿度采集与30秒定时实现

单总线传感器(如DHT22)是嵌入式环境监测系统的核心数据源,其通信依赖微秒级精确时序控制。在STM32平台中,需结合硬件定时器(如TIM2)构建稳定周期触发机制,并通过GPIO+精确延时(非HAL_Delay)完成协议解析。该方案突破整数读取局限,完整还原带一位小数的温度与湿度值,显著提升工业级数据精度。典型应用于物联网终端、智能农业节点及边缘侧环境监控系统,为MQTT/CoAP等协议上报提供结构化原始数据支撑。本实践基于STM32F103与HAL库,不依赖第三方驱动,具备强可移植性与工程鲁棒性。

weixin_42453228的博客 515

线程调用UpdateData()出错即解决办法

问题:在线程中使用UpdateData(FALSE)来更新窗口的内容,结果在Debug版本下面就出现了Assert报错.解决方案:UpdateData(FALSE)语句用SendMessage(WM_UPDATEDATA, FALSE)替代即可.xyz.h文件中:#define WM_UPDATEDATA WM_USER + 5 LRESULT OnUpdateData(WPARAM wParam

skyereeee的专栏 4084

宏杉MacroSan存储开局指导-流程

目录 1. 导入ODSP授权 2.1.版本确认 2.2.存储设备升级U盘、升级光盘制作方法 开局流程如下: 1. 导入ODSP授权 ODSP授权文件随设备附带,拆箱可见 2.1.版本确认 java模式 html模式 2.2.存储设备升级U盘、升级光盘制作方法 准备工具 空白U盘: 1个,容量要求大于等于4GB。仅制作升级U盘时需要。 制作升级U盘步骤 1.将U盘插入PC机USB口,保证PC机能识别到U盘。 2.运行UltraISO,选择菜单中的 文件-&g...

飞天板砖 4280

1、STVD和STVP的使用及串口烧写程序教程

文章目录一、前述二、STVD的使用三、STVP的使用1、STVP的作用:2、STVP的使用四、串口烧录程序 一、前述 STVD是意法半导体推出的,可以支持STM8和STM32 而IAR不尽如此,还支持51,MSP430等芯片 软件开发环境:编写程序,调试软件功能,下载固件到单片机中 硬件开发环境:连接外围电路,驱动功能外设,实现电气功能 最终构成一个以STM8系列单片机作为控制核心的应用系统。 MCS-51 一般的开发环境是 IAR 和 Keil STM8 一般的开发环境是 IAR 和 ST

Clichong 1万+

变量与对话框的交互:UpdateData(FALSE)&&UpdateDate(TRUE)

UpdateData(TRUE)和UpdateData(FALSE)的区别   当你使用了ClassWizard建立了控件和变量之间的联系后:当你修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用UpdateData(FALSE);如果你希望知道用户在对话框中到底输入了什么,就应该在访问变量前调用UpdateData(TRUE)。 UpdateData(

SurfingAnt的专栏 698

在 SAP ABAP 生态中偏爱面向对象,而不是过程式堆叠

本文探讨了ABAP开发中过程式与面向对象编程的共存现状及优化方向。文章指出,虽然过程式编程在ABAP中仍广泛存在,但随着业务复杂度提升,面向对象编程在可维护性、可测试性和重构便利性方面展现出明显优势。作者建议将过程式代码作为"适配层",仅负责输入输出转换,而将核心业务逻辑封装在类中。文章通过实际案例展示了这种架构如何提高交付效率,并提供了将Function Module转化为"薄包装"的具体实现方案,强调面向对象设计在SAP Gateway和RAP等现代架构中的重要性

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 136

线程中使用UpdateData出错解决方法(转)

线程中使用UpdateData出错解决方法(转) http://hi.baidu.com/leonardhuang/blog/item/d5fa133f814777cc9e3d62ee.html   最近写一个程序,需要在自己创建的工作线程中更新窗口数据。在使用UpdataData(false)来实现时,总是报错,在网上搜了一下,才知道在工作线程中不能使用UpdateData来

wendeng6780的博客 865

【ARXML专题】-2-创建一个Classic CAN(经典CAN2.0)/CANFD的系统描述ARXML文件

目录 1 创建一个AUTOSAR系统描述 2 物理层命名以及创建ECU 3 新建一个Frame 4 新建一个PDU 5 新建一个signal 6 结尾 AUTOSAR System Description Network Explorer是一个文件编辑器,支持可视化和编辑系统描述的AUTOSAR系统描述文件和ECU摘录的通信内容,它支持架构版本4.0.3、4.1.2、4.2.1、4.2.2和4.3.0。AUTOSAR系统描述(ARXML)文件是基于XML的文件格式,描述网络通信的元素...

「汽车电子助手」的博客 1万+

CAPL自动化测试

通过本文的学习,读者应该对CAPL自动化测试有了初步的了解,并能够编写复杂的CAPL脚本。在实际项目中,CAPL的应用非常广泛,希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1528

UpdateData在子线程中出错的解决方法ZZ

在对话框类中创建的线程中,不能直接用UpdateData来更新数值。解决的办法,应该自己定义一个消息,将UpdateData(FALSE)替换为SendMessage(WM_UPDATEDATA, FALSE)就可以了。具体的做法如下:首先,定义消息和回调函数12#define WM_UPDATEDATA WM_USER + 1LRESU

Minds' Paradise / 意念之地 541

泰凌微8258入门教程 基础篇①——Bluetooth® SIG Mesh 快速上手

Bluetooth® SIG Mesh Quick Start

6730

工作线程中使用UpdateData出错解决方法

在工作线程中不能使用UpdateData来更新主线程中的数据。界面的东西,最好就是用主线程(界面线程)去执行相应的操作。要想在子线程(工作线程)里执行界面线程的操作,最好是向主线程发送消息。因为MFC的CWnd用到了TLS,所以不是线程安全的。 解决办法: 1.定义一个消息 #define WM_UPDATE_MESSAGE (WM_USER+200) 2.定义消息映射 BEGIN_MES

ztsinghua的专栏 1105

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MFC下多线程UpdateData的使用方法

本文转载于http://blog.pfan.cn/yuqiexing/52543.html 线程中是不可以调用父窗口的UpdateData,原因如下:   当创建窗口的线程和UpdateData调用所在的线程不是同一线程的时候MFC就会出错。为MFC把部分信息储存在线程的TLS中,这些信息对于MFC的执行非常重要,因此MFC会在很多代码里面检查线程状态是否正确。当在线程中调用

倒计时 2858

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

UpdateData在线程中出错的解决办法 .

UpdateData在线程中出错的解决办法 2009年12月3日 虚幻 发表评论 阅读评论 最近在写一个监视程序,需要定时查看共享内存中的各个值。于是在MFC中,首先开了一个线程,用的是boost的timer,每隔1秒读取共享内存中的值,另外一个线程通过调用Upd

MOKA 911

(转)UpdateData在线程中出错的解决办法

UpdateData在线程中出错的解决办法 2009年12月3日 虚幻 发表评论 阅读评论 最近在写一个监视程序,需要定时查看共享内存中的各个值。于是在MFC中,首先开了一个线程,用的是boost的timer,每隔1秒读取共享内存中的值,另外一个线程通过调用UpdateData(FALSE)将值显示在界面上。但是在我调试的时候发现,UpdateData一直报错。 最...

dianyin8310的博客 338

工作线程中调用UI线程创建的窗口的UpdateData会导致Assert的问题及解决办法.

    最近写了个代码,在UI线程中创建了一个窗口,然后在工作线程中修改了这个窗口中的一些数据,然后想用UpdateData(FALSE)来更新窗口的内容,结果在Debug版本下面就出现了Assert报错,说出错地方是wincore.cpp的888行和889行,就是这两句  ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||   (p

土星·北海若 2532

工作线程中调用UI线程创建的窗口的UpdateData会导致Assert的问题及解决办法(ZZ)

最近写了个代码,在UI线程中创建了一个窗口,然后在工作线程中修改了这个窗口中的一些数据,然后想用UpdateData(FALSE)来更新窗口的内容,结果在Debug版本下面就出现了Assert报错,说出错地方是wincore.cpp的888行和889行,就是这两句  ASSERT((p = pMap->LookupPermanent(m_hWnd)) != NULL ||   (p = p

faithmy509的专栏 2334
上一篇: 多线程学习
下一篇: 【C++专题】static_cast, dynamic_cast, const_cast探讨
任逍遥2011
博客等级 码龄16年 16粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值