<转帖自> http://pfa2008.blog.163.com/blog/static/60200748201071510561771/>
这是由于MFC对象不能跨线程访问造成的,解决方案,可以有创建一个新的线程,将MFC对象传递给另外一个线程。
但还有一种更简单的解决方案,就是由Debug模式换成Release模式,在编译运行就能解决该问题,但这样却不利于调试,并且这样做的具体原因我也不明白。
还有一种解决方案,是自定义一个消息,每当要更新数据时,就发送一个消息,调用消息函数来更新数据。
做法如下:
第一步:定义消息。
#define WM_ON_UPDATE_DATA (WM_USER+100)
第二步:在类头文件的AFX_MSG块中说明,定义消息处理函数
//{{AFX_MSG(CMySRDlg)
virtual BOOL OnInitDialog();
afx_msg LRESULT On_Update_Data_Message(WPARAM wParam, LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
第三步:写出该函数调用Update的函数体
LRESULT CMySRDlg::On_Update_Data_Message(WPARAM wParam, LPARAM lParam)
{
CMySRDlg* myDlg=(CMySRDlg*)wParam;
INT16 nTmp=(INT16)lParam;
myDlg->UpdateResult(nTmp); //处理过程以及调用UpdateData()在该函数中实现
return 0;
}
void CMySRDlg::UpdateResult( INT16 res )
{
if(res!=-1)
{
CString str;
str.Format("%d/r/n",res);
m_Result+=str;
UpdateData(FALSE);
}
}
第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。
BEGIN_MESSAGE_MAP(CMySRDlg, CDialog)
//{{AFX_MSG_MAP(CMySRDlg)
ON_MESSAGE(WM_ON_UPDATE_DATA,On_Update_Data_Message)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
第五步:在需要的地方调用SendMessage函数
SendMessage(WM_ON_UPDATE_DATA,(unsigned int)this, 100);
这种方法容易理解,也方便调试。