admin管理员组

文章数量:1530842

2024年7月21日发(作者:)

西安理工大学 卢江涛

经典解决问题:

关于UpdateData(FALSE)的运用,UpdateData(FALSE)函数用来更新edit控件中的

内容,但是UpdateData(FALSE)函数有一个弊端,就是在主窗口主线程程中用是没有问题

的,但是一旦在非主线程(比如工作线程或者子线程)中使用,就会产生Debug Assertion

Failed的错误,这个错误为线程冲突错误,是UpdateData(FALSE)函数在非主线程中使用

经常产生的错误,当然这个错误是Debug环境下会产生的错误,在release环境下会忽略,

下面就介绍一下如何在Debug环境下解决此类错误:

比如我们新建了一个名为winsockserver的MFC工程,该工程作用是担当有连接网

络通信的服务器端,则解决错误步骤为

1. 在winsockserverDlg.h头文件中加入如下红色字体语句

#if !defined(AFX_WINSOCKSERVERDLG_H__0AB5CD32_7C63_41B0_AB27_7AC

BA754BDBA__INCLUDED_)

#define

AFX_WINSOCKSERVERDLG_H__0AB5CD32_7C63_41B0_AB27_7ACBA754BDBA__IN

CLUDED_

#define WM_UPDATEDATA WM_USER+1

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

还有如下红色字体语句:

protected:

HICON m_hIcon;

// Generated message map functions

//{{AFX_MSG(CWinsockserverDlg)

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

afx_msg void OnButton1();

afx_msg void OnButton3();

afx_msg LRESULT OnUpdateData(WPARAM wParam,LPARAM IParam);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

2. 用消息映射的方法将原本在非主线程中的UpdateData(FALSE)放到主线程中去,在

程序文件的消息映射中加入红色字体所示

BEGIN_MESSAGE_MAP(CWinsockserverDlg, CDialog)

//{{AFX_MSG_MAP(CWinsockserverDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON1, OnButton1)

ON_BN_CLICKED(IDC_BUTTON3, OnButton3)

ON_MESSAGE(WM_UPDATEDATA,OnUpdateData)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

3. 将UpdateData(FALSE)放到主线程中去是以函数的形式存在的,在

程序文件中加入如下红色字体所示

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

LRESULT CWinsockserverDlg::OnUpdateData(WPARAM

IParam)

{

UpdateData(FALSE);

return 0;

wParam,LPARAM

}

4. 在子线程中要进行edit控件的更新,则只需向主线程发送消息即可,在

程序文件中加入如下红色字体所示

UINT ReceiveMessage(LPVOID pParam)

{

CWinsockserverDlg * c = (CWinsockserverDlg *) pParam;

char buffer[1024];

int error;//记录recv函数返回值,即接收的字节数,也作异常代码

AfxMessageBox("循环开始啦!");

while( error = recv(c->toClient, buffer, 1024, 0))

{

if(error == 0 || error == SOCKET_ERROR)break;

c->m_chat += "Client:";

c->m_chat += buffer;

c->m_chat += "rn";

c->SendMessage(WM_UPDATEDATA,0,0);

}

return 0;

}

经过上述4个步骤,即可实现UpdateData(FALSE)函数在非主线程中的灵活运用而不

再报Debug Assertion Failed错误。

本文标签: 错误主线函数