资源描述:
《Windows95多线程间同步事件的控制方法》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Windows95多线程间同步事件的控制方法引言Windows95是一个多任务、多线程的操作系统,其中的每一个应用程序都是一个进程(process)。进程可以创建多个并发的线程(thread),同时进程也以主线程(primarythread)的形式被系统调度。所谓的线程是系统调度的一个基本单位,在程序中线程是以函数的形式出现的,它的代码是进程代码的一部分,并与进程及其派生的其它线程共享进程的全局变量和文件打开表等公用信息。主线程类似于UWX系统中的父进程,线程则类似于了进程。主线程也是一个线程,称作主线程仅仅是为了和它创建的线程区别开来。每个线程都相对于主线程而独立运行
2、,为了使得线程能对用户的控制作出响应,必须控制线程的运行,比如用户可暂停、终止一个线程的运行或改变线程运行的条件等。而且在用户控制与线程运行之间有吋应该有一定的同步控制关系,以保证用户对线程的冇效控制。线程口J以根据不同的条件对用户的控制作出不同的响应。为了实现上述目的必须使用系统提供的同步对象(SynchronizationObject),i\event对彖。编写多线程应用程序必须使用Win32APIo二,线程的创建方法调用Win32API屮的CreateThread函数创建线程。hThread=CreateThread(NULL,0,&TEventWindow::
3、ThreadFunc,this,0,&hThreadId);第一个参数设定线程的安全属性,因其仅用于WindowsNT,故不设定。第二个参数为0指定线程使用缺省的堆栈大小。第三个参数指定线程函数,线程即从该函数的入口处开始运行,函数返回时就意味着线程终止运行。第四个参数为线程函数的参数,可以是指向任意数据类型的指针。第五个参数设定线程的牛成标志。hThreadld存放线程的标识号。线程函数如下定义,上述的this参数是指向线程所属窗口的句柄指针,通过thrdWin参数传送过来,利用这个指针再调用相应的LoopFunc函数,线程的具体事务都在这个函数屮执行。DWORDst
4、dcallTEventWindow::ThreadFunc(void*thrdWin){returnSTATIC_CAST(TEventWindow*,thrdWin)->LoopFunc();}"三,线程的同步事件控制方法Windows95提供两种基本类型的系统对象,一种是彼此互斥的对象,用來协调访问数据,如mutex对象;一种是事件同步对象,用來发送命令或触发事件,安排事件执行的先后次序,如event对彖。系统对象在系统范围内有效,它们都具有自己的安全属性、访问权限和以下两种状态中的一种:Signaled和nonSignaled。对于event对象调用SetEven
5、t函数可将其状态设为Signaled,调用ResctEvent函数则可将其状态设为nonSignaledo演示程序屮的线程在一个大循环屮不断地将运行结果显示出来,当用户要关闭窗口时线程才终止运行。不过必须在窗口关闭之前先终止线程的运行,否则线程运行的结果将会显示在屏幕的其他地方,所以有必要在线程结朿与关闭窗口这两个事件之间建立起同步关系。为此在TEventWindow类的构造函数中创建两个event对象,用來实现事件同步。hCloseEvent=CreateEvent(0,FALSE,FALSE,0);hNoCloseEvent=CreateEvent(0,FALSE,
6、FALSE,0);第二个参数为FALSE表示创建的是-个自动event对象,第三个参数为FALSE表示对象的初始状态为nonSignaled,第四个参数为0表示该对象没有名字。在TEventWindow类的构造函数中还同样创建hWatchEvent和hNtyEvent对象,初始状态都为nonSignaledo用户要关闭窗口时,程序首先调用CanClose函数,在该函数中设置hCloseEvent对彖的状态为Signaled,利用这个方法来通知线程,要求线程终止运行。然后主线程调用函数WaitForMultipieObjects(该函数以下简称wait函数),wait函数
7、先判断对象hThrcad和hNoCloscEvcnt中任意一个的状态是否为Signaled,如杲都不是就堵塞主线程的运行,直到上述条件满足;如果冇一个对彖的状态为Signaled,wait函数就返冋,不再堵塞主线程。如果对彖是口动event对彖,wait函数在返冋之前述会将对象的状态设为nonSignaledoWait函数屮的参数FALSE表示不要求两个对象的状态同时为Signaled,参数-1表示要无限期地等待卜•去直到条件满足,参数2表示SignalsC数组中有两个对象。在Windows95屮线程也被看作是一种系统对彖,同样具冇两种状