使用子线程去调用UpdateData(TRUE/FALSE)方法更新窗体控件值时,总是会弹出“Debug Assertion Failed”异常错误;
原因是:工作线程(子线程)中不能使用UpdateData来更新主线程中的数据。界面的东西,最好就是用主线程(界面线程)去执行相应的操作。要想在子线程(工作线程)里执行界面线程的操作,最好是向主线程发送消息。因为MFC的CWnd用到了TLS,所以不是线程安全的。
解决方法:使用消息机制,PostMessage或者SendMessage方式给主线程发送消息,让主线程来实现刷新的操作。
1、定义一个消息 #define WM_UPDATE_MESSAGE (WM_USER+100)
2、定义消息映射
BEGIN_MESSAGE_MAP(CCServerDlg, CDialog)
{
{
{AFX_MSG_MAP(CCServerDlg)
...
ON_MESSAGE(WM_UPDATE_MESSAGE, &CXXXDlg::OnUpdateMessage)
}}AFX_MSG_MAP
END_MESSAGE_MAP()
END_MESSAGE_MAP()
3、在头文件中定义消息处理函数
4. 完成函数内容,只需调用UpdateData()即可
LRESULT CXXXDlg::OnUpdateMessage(WPARAM wParam, LPARAM lParam)
{
UpdateData(false);
return 0;
}
{
}
5.线程中的调用发送消息的方法
PostMessage(WM_UPDATE_MESSAGE ,NULL,NULL);
6.程序中启动线程