线程间通信方式

线程间通信方式主要包括消息队列、使用全局变量和使用事件。

消息队列

消息队列,是最常用的一种,也是最灵活的一种,通过自定义数据结构,可以传输复杂和简单的数据结构。

在 Windows 程序设计中,每一个线程都可以拥有自己的消息队列(UI 线程默认自带消息队列和消息循环,工作线程需要手动实现消息循环),因此可以采用消息进行线程间通信 sendMessage,postMessage。

  1. 定义消息 #define WM_THREAD_SENDMSG=WM_USER+20;
  2. 添加消息函数声明 afx_msg int OnTSendmsg();
  3. 添加消息映射 ON_MESSAGE(WM_THREAD_SENDMSG,OnTSM);
  4. 添加 OnTSM() 的实现函数;
  5. 在线程函数中添加 PostMessage 消息 Post 函数。

全局变量

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

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

使用事件

使用事件 CEvent 类实现线程间通信,Event 对象有两种状态:有信号和无信号,线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作。

  1. 创建一个 CEvent 类的对象:CEvent threadStart; 它默认处在未通信状态;
  2. threadStart.SetEvent(); 使其处于通信状态;
  3. 调用 WaitForSingleObject() 来监视 CEvent 对象。