通过发送消息来实现线程间通信

通过发送消息来实现线程间通信

20081112日星期三

线程间通常需要通信,可以通过发送消息来实现线程间的通信。但通常将继承线程类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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值