项目中,mfc的窗口程序中有定时函数,还有socket通讯,不确定定时函数和socket接收数据之间有没有影响,考虑新建一个线程做这两个事。但是看到网友http://m.blog.csdn.net/blog/shimachao/8872577上面提到的:不要在线程函数体内操作MFC控件,因为每个线程都有自己的线程模块状态映射表,在一个线程中操作另一个线程中创建的MFC对象,会带来意想不到的问题。更不要在线程函数里,直接调用UpdataData()函数更新用户界面,这会导致程序直接crash。而应该通过发送消息给主线程的方式,在主线程的消息响应函数里操作控件。
既然都是还是最后还是发消息让主线程自己完成控件操作,因此只要不是繁琐的运算也就没有必要用多个线程解决了。但是找了找主线程和子线程之间的通信方式:
MFC主线程给子线程发送消息的方法:
与窗口消息不同,线程消息用ON_THREAD_MESSAGE来映射,发送消息用PostThreadMessage函数。
详述如下:
1. 声明一个派生自CWinThread的类,例如CMyThread类。
在类的声明中(.h头文件)加入消息处理函数
afx_msg void AFX_MSG_CALL OnReset(WPARAM wParam, LPARAM lParam); //
2. 在类的实现中(cpp文件)
添加消息映射宏
BEGIN_MESSAGE_MAP(CMyThread, CWinThread)
ON_THREAD_MESSAGE(DM_RESET, &CMyThread::OnReset) // DM_RESET为自定义的消息,此处假设为WM_USER+100
END_MESSAGE_MAP()
3. 实现消息处理函数体
void AFX_MSG_CALL CMyThread::OnReset(WPARAM wParam, LPARAM lParam)
{
// 加入自己的实现代码
}
4. 向线程对象发送消息,用CWinThread类的PostThreadMessage函数。
假设有一个CMyThread类的对象为m_thread;
m_thread.PostThreadMessage(DM_RESET,0,0);
详述如下:
1. 声明一个派生自CWinThread的类,例如CMyThread类。
在类的声明中(.h头文件)加入消息处理函数
afx_msg void AFX_MSG_CALL OnReset(WPARAM wParam, LPARAM lParam); //
2. 在类的实现中(cpp文件)
添加消息映射宏
BEGIN_MESSAGE_MAP(CMyThread, CWinThread)
ON_THREAD_MESSAGE(DM_RESET, &CMyThread::OnReset) // DM_RESET为自定义的消息,此处假设为WM_USER+100
END_MESSAGE_MAP()
3. 实现消息处理函数体
void AFX_MSG_CALL CMyThread::OnReset(WPARAM wParam, LPARAM lParam)
{
// 加入自己的实现代码
}
4. 向线程对象发送消息,用CWinThread类的PostThreadMessage函数。
假设有一个CMyThread类的对象为m_thread;
m_thread.PostThreadMessage(DM_RESET,0,0);