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错误。
版权声明:本文标题:Debug Assertion Failed错误如何消除 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1721565802a885436.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论