等待函数
Win32 API提供了一组能使线程阻塞其自身执行的等待函数。这些函数只有在作为其参数的一个或多个同步对象产生信号时才会返回。在超过规定的等待时间后,不管有无信号,函数也都会返回。在等待函数未返回时,线程处于等待状态,此时线程只消耗很少的CPU时间。
使用等待函数即可以保证线程的同步,又可以提供程序的执行效率吧。其中最常用的等待函数有WaitForSingleObject和WaitForMultipleObject,他们分别用于检测单个同步对象和多个检测同步对象。
1.WaitForSingleObject
函数的原型如下:
DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMillisenonds);
参数hHandle是同步对象的句柄。参数dwMilliseconds是以毫秒为单位诶的超时间隔,如果该参数为0,那么函数就测试同步对象的状态并立即返回,如果该参数为INFINITE,则超时间隔是无限的。
2.WaitForMultipleObject
原型如下:
DWORD WaitForMultipleObject(DWORD nCount,CONST HANDLE *lpHandles,BOOL bWaitAll,DWORD dwMilliseconds);
参数lpHandles代表一个句柄数组,而参数cCount是句柄数组中的数目。参数bWaitAll说明了等待类型,如果是TRUE,那么函数在所有对象有信号后才返回;如果是FALSE,则只要有一个对象变成有信号的函数就返回。参数deMilliseconds是以毫秒为单位的超时间隔,如果参数为0那么函数就测试同步对象的状态并立即返回;如果该参数为INFINITE,则超时间隔是无限的。
CEvent类实现线程同步
事件对象(CEvent)是最简单的同步对象,它包括有信号的无信号的两种状态。在线程访问某一资源之前,也许需要等待某一事件的发生,这时用事件对象最合适。例如,只有在通信端口缓冲区收到数据后,监视线程才被激活。
在MFC中,Cevent类提供了对事件的支持。CEvent对象有两种类型:人工事件和自动事件。对于自动时间,当其获得信号后,就会释放下一个可用的线程。一个自动的事件对象