线程间通信方式
进程与线程的区别 进程的通信方式 线程的通信方式

进程与线程的区别进程的通信方式线程的通信方式进程与线程的区别进程的通信方式线程的通信方式2011-03-15 01:04进程与线程的区别:通俗的解释一个系统运行着很多进程,可以比喻为一条马路上有很多马车不同的进程可以理解为不同的马车而同一辆马车可以有很多匹马来拉--这些马就是线程假设道路的宽度恰好可以通过一辆马车道路可以认为是临界资源那么马车成为分配资源的最小单位(进程)而同一个马车被很多匹马驱动(线程)--即最小的运行单位每辆马车马匹数=1所以马匹数=1的时候进程和线程没有严格界限,只存在一个概念上的区分度马匹数1的时候才可以严格区分进程和线程专业的解释:简而言之,一个程序至少有一个进程,一个进程至少有一个线程.线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。
每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。
但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。
但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。
这就是进程和线程的重要区别。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
线程间通信的几种方法

线程间通信的几种方法线程间通信是指在应用程序的多线程中,两个或者多个线程之间的交互操作。
线程间的通信可以帮助提高程序的执行效率,灵活实现复杂的并发任务。
下面将介绍几种实现线程间通信的方法。
一、使用共享变量法使用共享变量法是一种简单有效的线程间通信的方法,它采用的是类似全局变量的共享变量的方式,可以在两个线程之间共享数据。
在使用共享变量法进行线程间通信时,线程可以直接获取与同一变量相关的值,也可以在操作完共享变量之后对其更新,以便给另一个线程使用。
二、使用消息传递法使用消息传递法实现多线程通信是比较主流的一种方法,它基于给每个线程分配一个消息队列,当某一线程有消息需要传递时,就把消息放入另一线程的消息队列。
在线程间消息传递的过程中,当某一线程接收到另一线程发来的消息时,就可以按照消息的内容执行对应的操作。
使用消息传递法会消耗比较多的系统资源,但是它可以控制线程间消息的传递,实现更加灵活的线程间通信,同时也能保证线程间消息的实时性。
三、使用信号量机制信号量机制是一种常用的线程通信机制,它可以控制多个线程对共享数据的并发访问,从而解决多线程访问共享数据的并发问题。
在信号量机制中,每一个共享被抽象为一个信号量,而访问共享资源时,就是去获取信号量,当一个线程获取了信号量时,其他线程就无法对该共享资源进行访问,只有释放信号量之后,其他线程才能再次获取该信号量,从而访问共享数据。
四、使用管道机制使用管道机制进行多线程之间的通信,主要是把多个线程之间的数据放置在一个管道中,当线程A要把数据传给线程B时,就把数据写入管道中,线程B从管道中读取数据,完成线程间通信。
管道机制可以实现线程间通信的同步,而且在消息的传递上比一般的线程间通信更加高效。
但是,当管道的深度较大时,消息的传递过程会变得比较耗时,因此,管道机制的应用受到管道深度的限制。
以上就是简单介绍实现线程间通信的几种方法。
线程间通信是多线程编程中不可或缺的,因此,在实际开发中,选择合适的线程间通信方式,是非常重要的。
线程间通信的方式

线程间通信的方式一、概述线程是操作系统中最小的执行单元,它们能够并发地执行程序。
在多线程编程中,线程间通信是非常重要的一个概念。
线程间通信是指不同线程之间通过某种方式来交换信息或共享资源的过程。
本文将介绍几种常见的线程间通信方式。
二、共享内存共享内存是一种非常高效的线程间通信方式。
它允许多个线程访问同一块内存区域,从而实现数据共享。
在使用共享内存时,需要注意以下几点:1. 确定共享内存的大小和位置。
2. 确保多个进程对共享内存进行互斥访问。
3. 对于复杂数据结构,需要使用锁来保护数据。
三、消息队列消息队列是一种基于消息传递的通信机制。
在使用消息队列时,发送方将消息发送到队列中,接收方从队列中读取消息。
消息队列具有以下优点:1. 可以实现异步通信。
2. 可以避免死锁问题。
3. 可以实现多对多通信。
四、管道管道是一种半双工的通信机制。
它可以用于在父子进程之间或者兄弟进程之间进行通信。
在使用管道时,需要注意以下几点:1. 管道是半双工的,只能实现单向通信。
2. 管道在创建时需要指定缓冲区大小。
3. 管道可以用于进程间通信。
五、信号量信号量是一种用于控制并发访问的机制。
它可以用于多个线程之间的同步和互斥操作。
在使用信号量时,需要注意以下几点:1. 信号量分为二进制信号量和计数器信号量两种类型。
2. 二进制信号量只有两个状态,0和1,用于实现互斥操作。
3. 计数器信号量可以有多个状态,用于实现同步操作。
六、互斥锁互斥锁是一种常见的线程同步机制。
它可以用于保护共享资源不被多个线程同时访问。
在使用互斥锁时,需要注意以下几点:1. 只有拥有锁的线程才能访问共享资源。
2. 多个线程不能同时持有同一个锁。
3. 在使用锁时需要注意死锁问题。
七、条件变量条件变量是一种常见的线程同步机制。
它可以用于等待某个条件满足后再继续执行。
在使用条件变量时,需要注意以下几点:1. 条件变量必须与互斥锁一起使用。
2. 等待条件的线程会被阻塞,直到条件满足。
linux线程间通信的几种方法

linux线程间通信的几种方法Linux是一种开源的操作系统,它支持多线程编程,因此线程间通信是非常重要的。
线程间通信是指在多个线程之间传递数据或信息的过程。
在Linux中,有多种方法可以实现线程间通信,本文将介绍其中的几种方法。
1. 信号量信号量是一种用于线程间同步和互斥的机制。
它可以用来控制对共享资源的访问。
在Linux中,信号量是由sem_t类型的变量表示的。
它有三个主要的操作:初始化、P操作和V操作。
初始化操作用于初始化信号量的值。
P操作用于获取信号量,如果信号量的值为0,则线程会被阻塞,直到信号量的值大于0。
V操作用于释放信号量,将信号量的值加1。
下面是一个使用信号量实现线程间通信的例子:```#include <stdio.h>#include <pthread.h>#include <semaphore.h>sem_t sem;void *thread1(void *arg){sem_wait(&sem);printf("Thread 1\n");sem_post(&sem);pthread_exit(NULL);}void *thread2(void *arg){sem_wait(&sem);printf("Thread 2\n");sem_post(&sem);pthread_exit(NULL);}int main(){pthread_t t1, t2;sem_init(&sem, 0, 1);pthread_create(&t1, NULL, thread1, NULL); pthread_create(&t2, NULL, thread2, NULL); pthread_join(t1, NULL);pthread_join(t2, NULL);sem_destroy(&sem);return 0;}```在这个例子中,我们创建了两个线程,它们都需要获取信号量才能执行。
c语言线程间通信的几种方法

c语言线程间通信的几种方法一、全局变量全局变量是最简单的线程间通信方法之一。
不同的线程可以通过访问和修改同一个全局变量来实现信息的交换。
在使用全局变量时,需要注意对全局变量的访问同步问题,以避免数据竞争和不一致性的问题。
二、互斥锁(Mutex)互斥锁是一种同步原语,用于保护共享资源的访问。
线程在访问共享资源之前,首先要获取互斥锁,如果互斥锁已经被其他线程获取,则当前线程会被阻塞,直到互斥锁被释放。
通过对互斥锁的加锁和解锁操作,可以保证共享资源的访问是互斥的,从而避免了数据竞争和不一致性的问题。
三、条件变量(Condition Variable)条件变量是一种同步原语,用于在多线程环境下实现线程之间的协调。
条件变量通常与互斥锁一起使用,用于实现等待和唤醒的操作。
一个线程可以通过条件变量等待某个条件的发生,而另一个线程可以通过条件变量发送信号来唤醒等待的线程。
四、信号量(Semaphore)信号量是一种同步原语,用于实现线程之间的同步和互斥。
信号量可以用来控制对共享资源的访问数量。
当信号量的值大于0时,线程可以继续访问共享资源;当信号量的值等于0时,线程会被阻塞,直到信号量的值大于0。
通过对信号量的P操作(减操作)和V操作(加操作),可以实现线程的同步和互斥。
五、消息队列(Message Queue)消息队列是一种在多线程环境下进行线程间通信的机制。
不同的线程可以通过向消息队列发送消息和从消息队列接收消息来进行通信。
消息队列可以实现线程之间的异步通信,提高系统的响应速度和并发性能。
六、管道(Pipe)管道是一种常用的线程间通信机制,可以用于在父子进程或者兄弟进程之间进行通信。
在多线程环境下,可以使用管道来实现线程之间的通信。
一个线程可以通过管道的写端向管道发送数据,另一个线程可以通过管道的读端从管道接收数据。
通过管道的读写操作,可以实现线程之间的数据交换。
以上就是几种常用的C语言线程间通信方法。
不同的方法适用于不同的场景,开发者可以根据具体的需求选择合适的线程间通信方法。
大疆面试

1.多线程间如何进行通信?主线程中如何知道子线程中信息是否加载好了?答:一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信。
这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明。
使用全局变量进行通信由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量。
对于标准类型的全局变量,我们建议使用volatile 修饰符,它告诉编译器无需对该变量作任何的优化,即无需将它放到一个寄存器中,并且该值可被外部改变。
如果线程间所需传递的信息较复杂,我们可以定义一个结构,通过传递指向该结构的指针进行传递信息。
使用自定义消息我们可以在一个线程的执行函数中向另一个线程发送自定义的消息来达到通信的目的。
一个线程向另外一个线程发送消息是通过操作系统实现的。
利用Windows操作系统的消息驱动机制,当一个线程发出一条消息时,操作系统首先接收到该消息,然后把该消息转发给目标线程,接收消息的线程必须已经建立了消息循环。
2.TCP和UDP协议,http协议。
http的错误响应码,200,300,400,304,还有其他的一些没见过的。
3.消息队列模型4.二叉树的深度优先遍历,写代码。
5.进程调度,进程间通信?6.OSI七层通信7.循环队列是什么?8.写代码,strlen和strncpy?9.设计微信的通信机制,要求数据传输可靠,快响应答:我提出仿照TCP和UDP协议来设计10.内核模式和用户模式怎么转换?11.写一个拷贝构造函数12.线程的数据处理答:和进程相比,线程的最大优点之一是数据的共享性,各个进程共享父进程处沿袭的数据段,可以方便的获得、修改数据。
但这也给多线程编程带来了许多问题。
我们必须当心有多个不同的进程访问相同的变量。
许多函数是不可重入的,即同时不能运行一个函数的多个拷贝(除非使用不同的数据段)。
C#线程间通讯
C#线程间通讯using System;using System.Text;using System.Windows.Forms;using System.Threading;namespace 线程间通讯{public partial class Form1 : Form{public Form1(){InitializeComponent();}//1.创建Invoke函数,⼤致如下:/// <summary>/// Delegate function to be invoked by main thread/// </summary>private void InvokeFun(){if (prgBar.Value < 100){prgBar.Value = prgBar.Value + 1;button1.Text = prgBar.Value.ToString();}if (prgBar.Value == 100){MessageBox.Show("完成", this.Text);prgBar.Value = 0;}}//2.⼦线程⼊⼝函数:/// <summary>/// Thread function interface/// </summary>private void ThreadFun(){//Create invoke method by specific functionMethodInvoker mi = new MethodInvoker( this.InvokeFun );for( int i = 0; i < 100; i++ ){this.BeginInvoke( mi );//让主线程去访问⾃⼰创建的控件.Thread.Sleep( 100 );//在新的线程上执⾏耗时操作.}}//3. Begin from hereprivate void button1_Click(object sender, EventArgs e){Thread thdProcess = new Thread(new ThreadStart(ThreadFun));thdProcess.Start();}}}在不做处理的情况下,如果⼦线程访问由主线程创建的控件时,系统都会报错,告诉我们线程间不能直接调⽤.因为不同的线程是在不同的内存空间中各⾃⽆⼲扰的并⾏运⾏着的.那么要怎么做才能让在⼦线程中访问到想要访问的控件呢?其实,从上⾯的例⼦中可以看出,实现线程间通讯其实并不复杂.thdProcess.Start()以后,开始了⼀个新的线程,这个线程从⼊⼝函数ThreadFun()开始.下⾯就是问题的关键了:代码中⽤到了MethodInvoker 委托,在MSDN中是这样描述它的:该委托可执⾏托管代码中声明为 void 且不接受任何参数的任何⽅法,在对控件的 Invoke ⽅法进⾏调⽤时或需要⼀个简单委托⼜不想⾃⼰定义时可以使⽤该委托。
thread的用法总结大全
thread的用法总结大全Thread是一个多线程编程的概念,在许多编程语言中都有Thread类或相关的API提供多线程编程的功能。
它允许程序同时执行多个任务,使得程序能够更加高效地利用计算机的资源,同时提高程序的响应速度和并发性。
以下是Thread的用法总结大全:1. 创建线程:- 继承Thread类,重写run()方法,并调用start()方法启动线程。
- 实现Runnable接口,重写run()方法,并通过Thread类的构造函数传入实现了Runnable接口的类。
2. 控制线程:- 使用start()方法启动线程。
- 使用join()方法等待线程执行完毕。
- 使用sleep()方法暂停线程的执行一段时间。
- 使用yield()方法让出当前线程的执行权。
3. 线程同步:- 使用synchronized关键字实现线程的互斥访问。
- 使用wait()、notify()和notifyAll()方法实现线程的等待和唤醒。
- 使用Lock和Condition接口实现线程的同步。
4. 线程间通信:- 使用共享对象作为通信的媒介,如通过共享变量进行数据的传递。
- 使用等待-通知机制实现线程间的通信,即wait()和notify()方法的配合使用。
5. 线程安全:- 使用线程安全的数据结构,如ConcurrentHashMap和CopyOnWriteArrayList。
- 使用线程安全的类,如AtomicInteger和CountDownLatch。
- 使用synchronized关键字或Lock接口实现线程安全。
6. 线程池:- 使用线程池管理线程的创建和销毁,提高线程的利用率和执行效率。
- 使用Executors类创建线程池,如newFixedThreadPool()、newCachedThreadPool()等。
- 使用ThreadPoolExecutor类自定义线程池的参数,如核心线程数、最大线程数和任务队列等。
进程间通信和线程间通信的几种方式
进程间通信和线程间通信的⼏种⽅式进程进程(Process)是计算机中的程序关于某数据集合上的⼀次运⾏活动,是系统进⾏资源分配和调度的基本单位,是结构的基础。
在早期⾯向进程设计的计算机结构中,进程是程序的基本执⾏实体;在当代⾯向线程设计的计算机结构中,进程是线程的容器。
程序是指令、数据及其组织形式的描述,进程是程序的实体。
进程是⼀个具有独⽴功能的程序关于某个数据集合的⼀次运⾏活动。
它可以申请和拥有系统资源,是⼀个动态的概念,是⼀个活动的实体。
它不只是程序的,还包括当前的活动,通过的值和处理的内容来表⽰。
进程的概念主要有两点:第⼀,进程是⼀个实体。
每⼀个进程都有它⾃⼰的地址空间,⼀般情况下,包括区域(text region)、数据区域(data region)和(stack region)。
⽂本区域存储处理器执⾏的代码;数据区域存储变量和进程执⾏期间使⽤的动态分配的内存;堆栈区域存储着活动过程调⽤的指令和本地变量。
第⼆,进程是⼀个“执⾏中的程序”。
程序是⼀个没有⽣命的实体,只有器赋予程序⽣命时(操作系统执⾏之),它才能成为⼀个活动的实体,我们称其为。
进程是具有⼀定独⽴功能的程序关于某个数据集合上的⼀次运⾏活动,进程是系统进⾏资源分配和调度的⼀个独⽴单位。
每个进程都有⾃⼰的独⽴内存空间,不同进程通过进程间通信来通信。
由于进程⽐较重量,占据独⽴的内存,所以上下⽂进程间的切换开销(栈、寄存器、虚拟内存、⽂件句柄等)⽐较⼤,但相对⽐较稳定安全。
线程线程是进程的⼀个实体,是CPU调度和分派的基本单位,它是⽐进程更⼩的能独⽴运⾏的基本单位.线程⾃⼰基本上不拥有系统资源,只拥有⼀点在运⾏中必不可少的资源(如程序计数器,⼀组寄存器和栈),但是它可与同属⼀个进程的其他的线程共享进程所拥有的全部资源。
线程间通信主要通过共享内存,上下⽂切换很快,资源开销较少,但相⽐进程不够稳定容易丢失数据。
⼀个线程可以创建和撤消另⼀个线程,同⼀进程中的多个线程之间可以并发执⾏。
C#线程间互相通信
C#线程间互相通信 C#线程间互相通信主要⽤到两个类:AutoResetEvent和ManualResetEvent. ⼀、AutoResetEvent AutoResetEvent 允许线程通过发信号互相通信,线程通过调⽤ AutoResetEvent 上的 WaitOne 来等待信号。
如果 AutoResetEvent 为⾮终⽌状态,则线程会被阻⽌,并等待当前控制资源的线程通过调⽤ Set 来通知资源可⽤。
下⾯我⽤吃快餐的例⼦来说明这个问题,吃快餐的时候都会排队付款,收银员发送收款通知,客户依次付钱,代码如下: 复制代码 1 class Program 2 { 3 //若要将初始状态设置为终⽌,则为 true;若要将初始状态设置为⾮终⽌,则为 false 4 static AutoResetEvent autoResetEvent = new AutoResetEvent(false); 5 6 static void Main(string[] args) 7 { 8 Thread t1 = new Thread(() => 9 { 10 Console.WriteLine("客户1在排队等待付钱…"); 11 12 //客户1调⽤AutoResetEvent上的WaitOne来等待付钱通知 13 autoResetEvent.WaitOne(); 14 Console.WriteLine("通知来了,客户1付钱"); 15 }); 16 t1.IsBackground = true; 17 t1.Start(); 18 19 Pay();//发送通知 20 Console.ReadKey(); 21 } 22 23 static void Pay() 24 { 25 string tip = Console.ReadLine(); 26 if (tip == "next") 27 { 28 autoResetEvent.Set();//收银员发送付钱通知,通过调⽤Set来通知客户付钱 29 } 30 } 31 } 复制代码 运⾏在屏幕中打印: 客户1在排队等待付钱… 等收银员说"next"的时候,向客户1发送付钱通知(autoResetEvent.Set()),屏幕打印: 客户1在排队等待付钱… next 通知来了,客户1付钱! AutoResetEvent类⼀次只能通知⼀个等待的线程,且通知⼀次过后会⽴即将AutoResetEvent对象的状态置为false,也就是如果有两个客户都在等待收银员通知,AutoResetEvent对象的set⽅法只能通知到第⼀个客户,代码和效果如下: 复制代码 1 class Program 2 { 3 //若要将初始状态设置为终⽌,则为 true;若要将初始状态设置为⾮终⽌,则为 false. 4 static AutoResetEvent autoResetEvent = new AutoResetEvent(false); 5 6 static void Main(string[] args) 7 { 8 Thread t1 = new Thread(() => 9 { 10 Console.WriteLine("客户1在排队等待付钱…"); 11 12 //客户1调⽤AutoResetEvent上的WaitOne来等待付钱通知 13 autoResetEvent.WaitOne(); 14 Console.WriteLine("通知来了,客户1付钱"); 15 }); 16 t1.IsBackground = true; 17 t1.Start(); 18 19 Thread t2 = new Thread(() => 20 { 21 Console.WriteLine("客户2在排队等待付钱…"); 22 23 //客户2调⽤AutoResetEvent上的WaitOne来等待付钱通知 24 autoResetEvent.WaitOne(); 25 Console.WriteLine("通知来了,客户2付钱!"); 26 }); 27 t2.IsBackground = true; 28 t2.Start(); 29 30 Pay();//发送通知 31 32 Console.ReadKey(); 33 } 34 35 static void Pay() 36 { 37 string tip = Console.ReadLine(); 38 if (tip == "next") 39 { 40 autoResetEvent.Set();//收银员发送付钱通知,通过调⽤Set来通知客户付钱 41 } 42 } 43 } 复制代码 运⾏后屏幕打印: 客户1在排队等待付钱… 客户1在排队等待付钱… next 通知来了,客户1付钱! 这就说明在通知完客户1后,autoResetEvent 的状态⼜被置为了false,这时如果要通知到客户2,就需要在通知完客户1后,再执⾏⼀次通知,在线程1中加上⼀⾏代码,如下: 复制代码 1 Thread t1 = new Thread(() => 2 { 3 Console.WriteLine("客户1在排队等待付钱…"); 4 5 //客户1调⽤AutoResetEvent上的WaitOne来等待付钱通知 6 autoResetEvent.WaitOne(); 7 Console.WriteLine("通知来了,客户1付钱"); 8 9 autoResetEvent.Set();//让其再通知下个客户 10 }); 复制代码 运⾏后屏幕打印: 客户1在排队等待付钱… 客户1在排队等待付钱… next 通知来了,客户1付钱! 通知来了,客户2付钱! 这也就说明每调⽤⼀次Set,只有⼀个线程会解除等待,换句话说,有多少个线程就要调⽤多少次Set,线程才会全部继续。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
线程间通信方式收藏
线程间通信可以通过下列三种方法:
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。