通过发送消息来实现线程间通信
2008年11月12日星期三
线程间通常需要通信,可以通过发送消息来实现线程间的通信。但通常将继承线程类CWinThread(在MFC中),需要注意两点:一是,线程函数的消息映射宏(ON_THREAD_MESSAGE);二是,给线程发消息的函数(PostThreadMessage)。详细的代码实现如下:
线程类:
BEGIN_MESSAGE_MAP(CCaculateThread, CWinThread)
ON_THREAD_MESSAGE(WM_CACULATE,OnCaculate) // 继承CWinThread类的消息映射
END_MESSAGE_MAP()
// CCaculateThread 消息处理程序
void CCaculateThread::OnCaculate(WPARAM wParam, LPARAM lParam)
{
// 计算求和
int nNum = (int)wParam;
int nSum = 0;
for (int i = 0; i < nNum; i++)
{
nSum += i;
}
Sleep(500);
// 将计算结果发给主线程
::PostMessage(GetMainWnd()->GetSafeHwnd(),WM_DISPLAY,nSum,NULL);
}
主窗口实现:
void CCommunicate_MultiThreadDlg::OnBnClickedButton1()
{
// 创建辅助线程来求和
m_pThread = (CCaculateThread*)AfxBeginThread(RUNTIME_CLASS(CCaculateThread));
Sleep(500);
// 给辅助线程发消息(通信)
m_pThread->PostThreadMessage(WM_CACULATE,m_nNum,NULL);
}
void CCommunicate_MultiThreadDlg::OnBnClickedRadio3()
{
// 选择求“+2+3+4+...+10=”
m_nNum = 10;
}
void CCommunicate_MultiThreadDlg::OnBnClickedRadio1()
{
// 选择求“+2+3+4+...+50=”
m_nNum = 50;
}
void CCommunicate_MultiThreadDlg::OnBnClickedRadio2()
{
// 选择求“+2+3+4+...+100=”
m_nNum = 100;
}
LRESULT CCommunicate_MultiThreadDlg::OnDisplay(WPARAM wParam, LPARAM lParam)
{
// 获取辅助线程的消息
int nSum = (int)wParam;
CString strSum;
strSum.Format(_T("%d"),nSum);
// 显示
m_Edit.SetWindowText(strSum);
return 0;
}