c++多线程(四)

线程间通信

主线程创建子线程必定会为主线程分担一部分工作,这样不可避免的会在这两个线程之间存在消息传递渠道,因此主线程和子线程之间要进行通信。

       下面介绍几种通信方式:

  1. 全局变量:由于同一进程的各个线程之间共享该进程的资源,因此,解决线程间通信最简单的方式是使用全局变量。对于标准类型的全局变量,使用validate修饰符,不让编译器对其优化,因为编译器如果对其优化,可能会导致线程间读取数据的不准确。例如一个变量num:
    [cpp]  view plain copy
    1. int num;  
    2. num = 1;  
    3. num = 2;  
    如果编译器进行优化,则会直接把2赋值给num。但是可能num=1,线程一使用;num=2,线程二使用。优化完以后则就发生数据不准确了。所以在前面的实例中,使用全局变量,都是带有validate修饰符。
  2. 自定义消息:
    可以在一个线程中向另一个线程发送消息来实现线程之间的通信。一个线程向另一个线程发送消息是通过操作系统实现的。当一个线程发送一个消息,操纵系统首先接收到消息,然后把此消息转发到目的线程。

         多线程实例6-----自定义消息实现线程间通信
此实例实现简单1到50,1到100,1到150相加,然后把相加结果显示出来。计算结果采用一个子线程实现(CalculateThread类,继承自CWinThread类),然后把计算结果通过消息发送给主线程。
部分代码:
CalculateThread.cpp
[cpp]  view plain copy
  1. // CalculateThread.cpp : implementation file  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "Mthread7.h"  
  6. #include "CalculateThread.h"  
  7. #include "Mthread7Dlg.h"  
  8.   
  9. #ifdef _DEBUG  
  10. #define new DEBUG_NEW  
  11. #undef THIS_FILE  
  12. static char THIS_FILE[] = __FILE__;  
  13. #endif  
  14.   
  15. /  
  16. // CCalculateThread  
  17.   
  18. IMPLEMENT_DYNCREATE(CCalculateThread, CWinThread)  
  19.   
  20. CCalculateThread::CCalculateThread()  
  21. {  
  22. }  
  23.   
  24. CCalculateThread::~CCalculateThread()  
  25. {  
  26. }  
  27.   
  28. BOOL CCalculateThread::InitInstance()  
  29. {  
  30.     // TODO:  perform and per-thread initialization here  
  31.     return TRUE;  
  32. }  
  33.   
  34. int CCalculateThread::ExitInstance()  
  35. {  
  36.     // TODO:  perform any per-thread cleanup here  
  37.     return CWinThread::ExitInstance();  
  38. }  
  39.   
  40. BEGIN_MESSAGE_MAP(CCalculateThread, CWinThread)  
  41.     //{{AFX_MSG_MAP(CCalculateThread)  
  42.         // NOTE - the ClassWizard will add and remove mapping macros here.  
  43.         ON_THREAD_MESSAGE(WM_CALCULATE,OnCalculate)  
  44.     //}}AFX_MSG_MAP  
  45. END_MESSAGE_MAP()  
  46.   
  47. /  
  48. // CCalculateThread message handlers  
  49.   
  50. LRESULT CCalculateThread::OnCalculate(WPARAM wParam, LPARAM lParam)  
  51. {  
  52.     int iTemp = 0;  
  53.   
  54.     for (int i=0; i<(int)wParam+1; i++)  
  55.     {  
  56.         iTemp = i + iTemp;  
  57.     }  
  58.     Sleep(500);  
  59.     //::PostMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_DISPLAY,iTemp,0);  
  60.     PostMessage(GetMainWnd()->GetSafeHwnd(),WM_DISPLAY,iTemp,0);  
  61.     return 0;  
  62. }  

主线程主要是创建子线程,并且发送计算消息给子线程,并且把计算需要的参数通过消息发送给计算线程。
部分代码如下:
[cpp]  view plain copy
  1. LRESULT CCalculateThread::OnCalculate(WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     int iTemp = 0;  
  4.   
  5.     for (int i=0; i<(int)wParam+1; i++)  
  6.     {  
  7.         iTemp = i + iTemp;  
  8.     }  
  9.     Sleep(500);  
  10.     //::PostMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_DISPLAY,iTemp,0);  
  11.     PostMessage(GetMainWnd()->GetSafeHwnd(),WM_DISPLAY,iTemp,0);  
  12.     return 0;  
  13. }  
执行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值