http://www.cnblogs.com/puxidun/archive/2009/12/06/1618142.html

线程间通信的三种方法

多线程通信的方法主要有以下三种: 

1.全局变量

进程中的线程间内存共享,这是比较常用的通信方式和交互方式。

注:定义全局变量时最好使用volatile来定义,以防编译器对此变量进行优化。

2.Message消息机制

常用的Message通信的接口主要有两个:PostMessage和PostThreadMessage,

PostMessage为线程向主窗口发送消息。而PostThreadMessage是任意两个线程之间的通信接口。

2.1.PostMessage() 
函数原型:

B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

参数:
hWnd:其窗口程序接收消息的窗口的句柄。可取有特定含义的两个值:
HWND.BROADCAST:消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口
和弹出式窗口。消息不被寄送到子窗口。
NULL:此函数的操作和调用参数dwThread设置为当前线程的标识符PostThreadMessage函数一样。
Msg:指定被寄送的消息。
wParam:指定附加的消息特定的信息。
IParam:指定附加的消息特定的信息。
返回值:如果函数调用成功,返回非零值:如果函数调用失败,返回值是零。

MS还提供了SendMessage方法进行消息间通讯,SendMessage(),他和PostMessage的区别是:

SendMessage是同步的,而PostMessage是异步的。SendMessage必须等发送的消息执行之后,才返回。

2.2.PostThreadMessage()

PostThreadMessage方法可以将消息发送到指定线程。

函数原型:BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam, LPARAM lParam);

参数除了ThreadId之外,基本和PostMessage相同。

目标线程通过GetMessage()方法来接受消息。

注:使用这个方法时,目标线程必须已经有自己的消息队列。否则会返回ERROR_INVALID_THREAD_ID错误。可以用
PeekMessage()给线程创建消息队列。

3.CEvent对象

CEvent为MFC中的一个对象,可以通过对CEvent的触发状态进行改变,从而实现线程间的通信和同步。
http://blog.csdn.net/wangrui_mail/article/details/5646712

线程间通信可以通过下列三种方法:

1)使用全局变量实现线程间通信

2)使用消息实现线程间通信

3)使用CEvent类实现线程间通信

使用全局变量实现线程间通信:

定义一个全局变量,不同的线程间可以通过修改全局变量的值来进行通信。例如:定义一个控制线程的全局变量

volatile int  threadController;

当 threadController值为1时,线程running;当threadController为0时,线程stop, 所以可以通过修改threadController的值来控制线程的运行。

使用消息实现线程间通信:

步骤:

1)在View.h中定义消息:

例如:

const WM_THREAD_SENDMESS=WM_USER+20;

2)在view.h中添加消息函数声明:

         例如:
         afx_msg int  OnThreadSendmess();
      3)在view.cpp中添加消息映射:
          ON_MESSAGE(WM_THREAD_SENDMESS,OnThreadSendmess)
      4)在view.cpp中添加OnThreadSendmess()的实现函数;
      5)在线程函数中添加PostMessage消息Post函数;

UINT TreadProc(LPVOID param)

        {
             CThreadTestApp *pApp=(CThreadTestApp *) AfxGetApp();
                 CMainFrame *pMainFrame = (CMainFrame *)pApp->GetMainWnd();
                  CThreadTestView *pView = (CThreadTestView *) pMainFrame->GetActiveView();
                  pView->m_strMessage = “启动了一个线程” ;
                  while(threadController)
                  {
                       ::Sleep(1000);
                       ::PostMessage((HWND)param, WM_THREAD_SENDMESS, 0, 0);
                       }
                      pView->m_iTime =0;
                      pView->m_strMessage = “线程结束”;
                      return 0;
}
      当执行到PostMessage函数时,就会产生在线程中产生一个消息,在主程序中触发相应的消息处理函数, 即完成了不同线程间的通信。
使用CEvent类实现线程间通信
      (1) Event对象:有两种状态:通信状态和非通信状态;
      (2)创建一个CEvent类的对象:CEvent  threadStart;它默认处在未通信状态;
      (3)threadStart.SetEvent();使其处于通信状态;
      (4)调用WaitForSingleObject()来监视CEvent对象;
         ::WaitForSingleObject(threadStart.m_hObject, INFINITE

转载于:https://www.cnblogs.com/wb118115/archive/2012/12/18/2824069.html

线程间通信的三种方法 (转)相关推荐

  1. android线程间通信的几种方法_Android 技能图谱学习路线

    Java基础 Java Object类方法 HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理 HashMap 和 HashTable 区别 HashCode 作用,如何重载hashC ...

  2. 线程间通信的几种方法_并发编程中的线程间通信

    线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 线程通信常用的方式有: wait/notify 等待 Volatile 内存共享 CountDownLatc ...

  3. android线程间通信的几种方法_Android进程间和线程间通信方式

    进程:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程:是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位 ...

  4. android线程间通信的几种方法_Android线程间通信机制

    讲解Handler机制的博文很多,我也看了很多,但说实话,在我对Handler几乎不怎么了解的情况下,每一篇文章我都没太看懂,看完之后脑子里还是充满了疑问.究其原因,是因为几乎每一篇文章一上来就开始深 ...

  5. 线程间通信的几种实现方式

    线程间通信的几种实现方式 首先,要短信线程间通信的模型有两种:共享内存和消息传递,以下方式都是基本这两种模型来实现的.我们来基本一道面试常见的题目来分析: 题目:有两个线程A.B,A线程向一个集合里面 ...

  6. android 多线程间通信,android实现线程间通信的四种常见方式

    1,通过Handler机制 主线程中定义Handler,子线程发消息,通知Handler完成UI更新,Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递conten ...

  7. python 线程通信的几种方式_进程间通信和线程间通信的几种方式

    进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代 ...

  8. JAVA线程间通信的几种方式

    今天在群里面看到一个很有意思的面试题: "编写两个线程,一个线程打印1~25,另一个线程打印字母A~Z,打印顺序为12A34B56C--5152Z,要求使用线程间的通信." 这是一 ...

  9. 线程间通信的几种方式

    Java线程间通信: 1:线程上下文 2:共享内存 3:IPC通信 4:套接字(Socket),不同的机器之间进行通信 另外:附注通信内容: linux常用的进程间的通讯方式 (1).管道(pipe) ...

最新文章

  1. 饮冰三年-人工智能-linux-07 硬盘分区、格式化及文件系统的管理
  2. Android应用源码安卓短信拦截木马项目源码
  3. HDU 3632 A Captivating Match
  4. jQuery 之父:每天写代码
  5. XI 安装MS SQLSERVER JDBC 驱动
  6. 一步一步做搜索(一)
  7. winrar 去广告_解压缩工具之WinRAR下载安装教程
  8. 来客电商之微信小程序怎么取名字
  9. pip install报错 There was a problem confirming the ssl certificate…
  10. 天气很热,用Python告诉你奶茶哪家最好喝性价比最高?
  11. 使用远程工具远程连接linux(xshell,xftp,xmanager,xrdp)
  12. 前端性能监控相关指标
  13. c语言中cap捕捉函数,CAP理论的理解
  14. [转载] 暗潮涌动:警惕IBM温情脉脉背后的垄断野心
  15. 【吾爱破解第一期】破解基础知识之认识壳与程序的特征
  16. 最简单的太阳能光伏发电系统
  17. 在header中添加中文头信息
  18. SP,Substance painter
  19. mac修改用户名,用户主目录名
  20. PV、EV、AC、SV、CV、SPI、CPI各是什么意思

热门文章

  1. 剑指Offer(Java实现)栈的压入、弹出序列
  2. Hadoop系列七:Hadoop之sqoop篇
  3. anaconda安装及环境变量配置
  4. 面试中你必须要知道的语言陷阱
  5. c语言的考试是操作电脑还是写试卷,C语言考试试卷都是基础的题目,由于本人没学过C语言,求各位帮忙, 爱问知识人...
  6. 高阶函数||编程范式: 命令式编程/声明式编程 || 编程范式: 面向对象编程(第一公民:对象)/函数式编程(第一公民:函数)
  7. fetch 发送 AJAX请求
  8. Python的可变类型和不可变类型
  9. java的知识点23——泛型Generics、Collection接口、List特点和常用方法、 ArrayList特点和底层实现
  10. Python 技术篇-百度语音识别API接口调用演示