MFC对象不支持多线程操作。MSDN这样解释的:
In a multi-threaded application written using MFC, you should not pass MFC objects across thread boundaries. As a general rule, a thread should access only those
MFC objects that it creates. Failure to do so may cause run-time problems including assertions or unexpected program behavior.
UpdateData()函数属于CDialog类的保护成员函数,在工作线程中不能使用UpdateData来更新主线程中的数据。更改界面的操作最好用主线程(界面线程),要想在子线程(工作线程)里执行界面线程的操作,可以通过向主线程发送消息来解决。
查了下资料,总结如下:
MFC对象不支持多线程操作,不能供多个线程进程使用,如果使用就可能产生错误。
子线程调用pDlg-> UpdateData(FALSE);时主线程会阻塞,而主线程是界面线程,Update必须由它完成,这样就形成死锁。
1、最通用的比较安全的解决方法:
主线程向子线程传递对象不安全,最好传递句柄;子线程中如果涉及对主线程的操作,最好利用PostMessage向主窗口发送自定义消息;在主窗口处理自定义消息,调用UpdateData(FALSE)。
方法2:
在线程进程里建立1个对话框地指针,在线程进程启动前把对话框地指针传递给线程进程里的指针对象或建立1个全局地对话框指针对象,在线程进程里调用。
方法3:
如果想要在线程进程中使用MFC,则要用AfxBeginThread创建线程进程。
方法4:
在线程进程中用如下方法获得你对话框指针:
CMyDlg* pDlg = (CMyDlg *)AfxGetApp()->m_pMainWnd;
pDlg->GetDlgItem(IDC_Edit1)->SetWindowText("OK");
方法5:
此个错误其实就为MFC在DEBUG模式下地保护性编程代码(Code)报错(有兴趣可以去读读编程代码(Code)),假如用Release模式编译及运行,不会出错,只不过在逻辑上存在风险。
这是我在使用管道进行进程操作时,遇到的一个问题,就是在线程里调用对话框的UpdateData函数总是出错。
//工作线程
DWORD WINAPI NewThread(LPVOID lParam)
{
CPipeDlg* pDlg=(CPipeDlg*)lParam;
=====================================================================================
=====================================================================================
pDlg->UpdateData(FALSE);//??????调试到这里有问题I
=====================================================================================
=====================================================================================
return
0;
}
运行如下所示,点击ping出现错误对话框。
将
pDlg->UpdateData(FALSE);
改为
pDlg->GetDlgItem(IDC_OUTPUT_INFO)->SetWindowText(pDlg->szOutPut);
程序运行后如图正常运行,当然最简单的方法是什么都不改,而是把编译及运行改为Release模式,结果一样正确。其他的方法我没有实验。
分享到:
相关推荐
基于VC_的对话框编程中UpdateData函数的应用,对话框的消息转化机制。
MFC对话框工程中UpdateData的使用 使用环境VS2010
很简单的信息管理而已,信息只包括姓名,性别,出生日期,婚否,部门,备注,简单的增删改查功能,如有问题,纯属菜鸟之作,谅解~~
当你使用了ClassWizard建立了控件和变量之间的联系后:当你修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用UpdateData(FALSE);如果你希望知道用户在对话框中到底输入了什么,就应该在访问变量前...
VC MFC文件读写操作的范例源码,本示例中涉及到CStdioFile写文件、CFile读写文件 、CFileFind、Shell操作。通过菜单可选择对应操作的执行结果,可比较一下与传统的文件操作有何不同。... UpdateData(FALSE);
VC 创建对话框对象、显示对话框窗口、删除对话框对象,在一个模式对话框中创建确认和取消按钮,以下代码为主要的代码: void CDemoDlg::OnOK() { //获得并检验对话框数据 if (!UpdateData(TRUE)) { ...
12.2.3.4 UpdateData函数 239 12.3 无模式对话框 240 12.3.1 CScrollView 240 12.3.2 CFormView 242 12.3.2.1 CFormView的创建 243 12.3.2.2 CFormView的消息预处理 245 12.3.2.3 CFormView的输入焦点 247 第13章 ...
12.2.3.4 UpdateData函数 239 12.3 无模式对话框 240 12.3.1 CScrollView 240 12.3.2 CFormView 242 12.3.2.1 CFormView的创建 243 12.3.2.2 CFormView的消息预处理 245 12.3.2.3 CFormView的输入焦点 247 第13章 ...
演示如何在工程中拥有多个对话框,及如何在一个对话框中调用另一个对话框。 重点:1、多个对话框类的建立;2、对话框的模式(Modal)调用方法;3、Spin控件的使用。 新建一个基于对话框的MFC工程, 通过菜单...
//启动串口监视线程 else AfxMessageBox("没有发现,或被其它设备占用"); return TRUE; // return TRUE unless you set the focus to a control //数据发送 void C XX Dlg::OnBuSend() { char str[128]=...
问题:假如一个对话框里有20多个编辑框,需要读取这些编辑框的数,如果每个编辑框都关联一个double类型的变量,用UpdateData()来获取读数,会很麻烦。 解决办法:建立第一个编辑框,之后按住Ctrl键用鼠标拖住编辑框...
在VC++开发环境中。。。MFC的UpdateData详细用法
LPCTSTR,UpdateData,memset,strstr这几个资源的详细用法说明。
//枚举窗口的回调函数 BOOL CALLBACK EnumWndProc(HWND hWnd,LPARAM lParam) { TCHAR szWndText[MAX_PATH]; unsigned long dwProcessID; GetWindowThreadProcessId(hWnd,&dwProcessID); if(dwProcessID==g_...
掌握基本的图形程序设计方法 掌握Java事件处理程序...2.方法updateData在方块落致底部时由timer调用,令game和watch更新游戏数据(如消去行,提取一个新的下落方块,增加得分,通过关卡,改变timer的延时加快方块
基于MFC调用系统时间,在edit box 上显示系统时间。仅仅实现显示功能。之后可以进行GPS时间的上传,都windows系统时间的校正 // TODO: Add extra initialization here CTime time = CTime::GetCurrentTime(); //...
HelloNative.java 准备调用C函数的java文件 HelloNative.lib 用VC编译生成的静态库文件 HelloNative.obj 用VB编译生成的目标文件 HelloNativeTest.java 测试本地化是否成功的类文件 instanceVar.java 定义一个...
UpdateData(1); case IDC_RUN://运行 ///////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// if( !bReset) { ...
7 添加一些按钮,映射各按钮的单击消息,并为响应函数编写代码如下 void CPageSimple::OnSimplestBtn() { MessageBox("这是最最简单的消息框"); } void CPageSimple::OnSimpleBtn() { AfxMessageBox("另...
3、添加各种按钮的单击事件处理方法的函数 控件名称列表: 主对话框标识:IDD_CALC_DIALOG 关于对话框标识:IDD_ABOUTBOX 编辑框: IDC_EDIT 运算符按钮标识: 加: IDC_BUTTONADD 减: IDC_BUTTONSUBTRACT 乘: ...