`
talentluke
  • 浏览: 604574 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

线程间通信的三种方法

 
阅读更多

线程间通信的三种方法

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

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的触发状态进行改变,从而实现线程间的通信和同步。
分享到:
评论

相关推荐

    C#线程间通信

    采用的是C#的Winform开发,提供了两种线程交互的方式。 第一:在主线程中开启两个子线程,子线程用事件方式来进行通信。对于主线程的控件操作采用的是delegate委托的方式,避免主线程假死。 第二:采用的是...

    线程间通信方式2:参数传递方式

    在Windows API中,我们通常使用以下三种方法创建线程: - **CreateThread函数**:这是Windows API提供的原生线程创建函数,允许开发者传递参数到新线程的入口点。创建线程时,可以通过`lpParameter`参数传递一个值...

    android 线程间通信

    ### Android线程间通信详解 #### 一、引言 Android应用程序通常运行在单个主线程上,称为“主线程”或“UI线程”。为了提高应用性能和用户体验,开发者经常需要利用多线程技术来执行后台任务,比如下载图片、获取...

    android 线程间通信显示同步时间

    线程间通信主要有以下几种方式: 1. Handler-Looper-Messenger机制:Handler用于发送和处理消息,Looper管理消息队列,而Messenger则作为跨进程通信的桥梁。在子线程中创建Handler,通过post或者sendMessage方法...

    MFC线程间通信方法和相关类,api函数的详细介绍和例子

    ### MFC线程间通信方法和相关类及API函数详解 #### 一、MFC线程间通信概览 在Microsoft Foundation Classes (MFC)框架中,线程间通信是多线程编程的一个核心概念。当一个应用程序由多个线程组成时,线程之间必须...

    Android中线程间通信.pdf

    ### Android中线程间通信详解 ...本文介绍了Android中线程间通信的基本概念和常见方法,并通过一个具体案例展示了如何在实际项目中应用这些技术。希望本文能帮助开发者更好地理解和掌握Android多线程编程。

    Java线程间通信的代码示例.zip

    在Java中,线程间通信主要通过共享内存(如共享变量)和消息传递(如wait(), notify(), notifyAll()等方法)来实现。以下是对这些知识点的详细说明: 一、共享内存通信 1. volatile关键字:当多个线程访问同一变量...

    多线程编程之三——线程间通讯

    下面将详细讨论几种常见的线程间通信方式。 1. 使用全局变量进行通信 全局变量是所有线程都能访问的内存区域,因此可以用来传递简单的数据。为了确保多线程环境下的正确性,通常会使用`volatile`关键字修饰全局变量...

    22-线程间通信和Android多线程1

    Handler、Looper和Message三者协同工作,Handler发送Message到消息队列,Looper不断循环处理消息,从而实现线程间通信。 - `HandlerThread`是预先配置好Looper的线程,适合长时间运行的后台任务。 - `AsyncTask`是...

    3种多线程实现同步方法

    事件对象是一种信号机制,用于线程间通信和同步。在Windows API中,CreateEvent函数创建一个事件对象,线程可以通过WaitForSingleObject或WaitForMultipleObjects函数等待事件的发生。当事件状态变为有信号时,等待...

    c++ 多线程编程之三----线程间通讯

    由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量。对于标准类型的全局变量,我们建议使用 volatile 修饰符,它告诉编译器无需对该变量作任何的优化,即...

    线程间同步机制 读写锁通信机制 线程与信号

    信号是进程间通信的一种方法,也可以应用于线程间通信。信号可以在任何时候发送到一个进程,被进程中的任何线程捕获。在多线程环境中,处理信号通常需要谨慎,因为默认行为可能会导致数据不一致性。线程可以通过...

    VC多线程编程的常用三种方法

    - **线程通信**:可以使用Windows的消息队列、事件对象、临界区等进行线程间的通信。 - **资源管理**:确保线程安全地访问共享资源,避免资源泄露。 - **异常安全**:考虑线程中的异常处理,确保在异常发生时能正确...

    Java多线程-线程间的通信

    这种机制被称为**等待-唤醒机制**,它是实现线程间通信的核心。 ##### (2)等待唤醒机制 等待唤醒机制是一种用于线程间协作的机制。它允许一个线程等待特定条件发生(通过调用`wait()`方法),并在条件满足时由...

    基于SOCKET和多线程的应用程序间通信技术的研究.pdf

    《基于SOCKET和多线程的应用程序间通信技术的研究》一文深入探讨了在不同程序之间采用SOCKET和多线程技术进行数据通信的方法。本文将详细解析标题和描述中的核心知识点,包括SOCKET和多线程的基本原理,以及它们在...

    C++实现多线程通信

    线程间通信的关键在于数据共享。在C++中,可以使用全局变量、类的成员变量或者静态成员变量来实现在不同线程间的共享。但是,无保护的共享数据可能会引发竞态条件,导致不可预测的行为。因此,需要采取适当的同步...

    线程同步(4种方法).rar

    下面将详细讲解这四种方法。 1. **互斥量(Mutex)** 互斥量是一种独占式同步机制,它允许只有一个线程拥有并访问某个资源。在C++中,可以使用`std::mutex`类来实现。当一个线程获得互斥量的所有权后,其他试图获取...

    基于MFC开发的多线程串口通信上位机

    3. **线程通信**: 可以使用消息队列或者事件对象(如CEvent)来实现线程间的通信和协作。 **四、MFCAPI串口实现** 结合MFC和API,我们可以创建一个名为MFCAPI_SerialComm的类,这个类封装了串口的打开、关闭、读写...

    深入解析Java的线程同步以及线程间通信

    除了同步机制,Java还提供了线程间通信的手段,如`wait()`、`notify()`和`notifyAll()`方法。这些方法都是在`Object`类中定义的,可以在同步块或同步方法中使用。它们用于线程之间的协作,例如等待条件满足或通知...

Global site tag (gtag.js) - Google Analytics