一般而言,应用程序中的一个辅助线程总是为主线程执行特定的任务,这样,在主线程和辅助线程之间必须提供一种在线程间进行信息传递的机制,也就是主线程和辅助线程间要进行通信。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的。有多种方法可以达到这个目的,在本小节将逐一说明。
第5.3节中的例子只说明了怎样启动一个线程,这对于一些应用程序已经足够了,但是复杂的多线程应用程序必然要求线程之间以及主线程与其它线程之间进行通信和协作。
1. 使用全局变量进行通信
因为属于同一个进程的各个线程共享操作系统分配给该进程的资源,所以解决线程间通信最简单的一种方法是使用全局变量。一般而言,线程间通信所需传递的信息比较复杂,我们通常为了线程间进行通信定义一个结构(通常称为“公共数据区”),各个线程将自身提供的“信息”写入“公共数据区”中,并从其中获得其他线程提供的信息。通常,我们将指向该“公共数据区”的指针在创建线程时作为参数被传递给线程的创建函数,进而被传递给线程的执行函数,这样线程便获得了访问权。
例如在前面的实例MutiThreadA中,就定义了线程通信用的结构threadInfo。
接着,在对话框类CMultiThreadADlg中定义了threadInfo类型的成员变量Info作为“公用数据区”,在主线程的CMultiThreadADlg::OnBtStart ()中通过调用AfxBeginThread()函数将指向它的指针传入线程:
pThread = AfxBeginThread (ThreadProc, &Info);
在线程的执行函数ThreadProc中通过调用:
threadInfo* pInfo = (threadInfo*) lpParam;
得到了指向“公共数据区”Info的指针pInfo,这样该线程就可以通过更新和读取Info来达到与其它线程通信的目的。
2. 使用自定义消息
我们可以在一个线程的执行函数中向另一个线程发送自定义的消息来达到通信的目的。一个线程向另外一个线程发送消息是通过操作系统实现的。利用Windows操作系统的消息驱动机制,当一个线程发出一条消息时,操作系统首先接收到该消息,然后把该消息转发给该消息的目标线程,接收消息的线程必须已经创建了消息循环,才能接收操作系统转发过来的消息。
在上面的实例MutiThreadA中,当线程的执行函数ThreadProc()中的主操作完成之后,我们在ThreadProc()中调用AfxMessageBox()来弹出消息框,以通知用户线程已经执行完毕。下面我们将对MutiThreadA进行修改,在其主对话框窗口中通知用户。具体步骤如下:
(1)定义用户自定义消息。
在CMultiThreadADlg 类的实现文件MultiThreadADlg.cpp中添加宏定义:
修改“公共数据区”结构threadInfo,在其中添加一个成员,如程序清单5-5所示。
程序清单5-5 修改后的threadInfo结构
(www.xing528.com)
然后,在OnBtStart成员函数中添加对pDlg成员的赋值,如程序清单5-6所示。
程序清单5-6 OnBtStart()函数的实现
给MultiThreadADlg.cpp中定义的线程函数ThreadProc()添加一条发送消息的语句,同时注释掉语句AfxMessageBox("进度条操作结束!")。
程序清单5-7 ThreadProc()函数的修改
在主对话框窗口类中响应USER_PROC_FINISHED消息。在CMultiThreadADlg类的头文件MultiThreadADlg.h中声明消息处理函数,位置如程序清单5-8。
程序清单5-8 MultiThreadADlg.h的修改
在MultiThreadADlg.cpp中嵌入如程序清单5-9所示的消息映射宏。
程序清单5-9 MultiThreadADlg.cpp的修改
同时定义消息处理函数OnFinished()如程序清单5-10所示。
程序清单5-10 OnFinished函数
(2)编译上述程序,执行结果如图5-11所示。
图5-11 运行结果
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。