Win32 API提供了一组【等待功能】来允许线程阻止自己的执行。有三种类型的等待功能:
*单个对象
*多对象
*可报警
等待功能在满足指定的条件之前不返回。等待功能的类型决定了使用的标准集。当调用wait函数时,它会检查是否满足等待条件。如果没有满足标准,则调用线程进入有效的等待状态,在等待满足条件的同时消耗很少的处理器时间。
单对象等待功能
SignalObjectAndWait,WaitForSingleObject和WaitForSingleObjectEx功能需要一个同步对象的句柄。当发生以下情况之一时,这些函数返回:
*指定的对象处于信号状态。
*经过了超时间隔。超时间隔可以设置为INFINITE,以指定等待时间不会超时。
SignalObjectAndWait函数使调用线程能够将对象的状态原子地设置为发信号,并等待另一对象的状态被设置为发信号。
多对象等待功能
WaitForMultipleObjects,WaitForMultipleObjectsEx,MsgWaitForMultipleObjects和MsgWaitForMultipleObjectsEx函数使调用线程能够指定包含一个或多个同步对象句柄的数组。当发生以下情况之一时,这些函数返回:
*任何一个指定对象的状态设置为发信号或所有对象的状态都已设置为发信号。您可以控制是否在函数调用中使用一个或所有状态。
*经过了超时间隔。超时间隔可以设置为INFINITE,以指定等待时间不会超时。
MsgWaitForMultipleObjects和MsgWaitForMultipleObjectsEx功能允许您在对象句柄数组中指定输入事件对象。当您指定在线程的输入队列中等待输入的类型时,这样做就可以了。
例如,线程可以使用MsgWaitForMultipleObjects阻止其执行,直到指定对象的状态被设置为发出信号,并且线程的输入队列中有可用的鼠标输入。该线程可以使用GetMessage或PeekMessage函数来检索输入。
当等待所有对象的状态被设置为发信号时,这些多对象函数不会修改指定对象的状态,直到所有对象的状态被设置为发信号。例如,可以用信号通知互斥体对象的状态,但是调用线程在数组中指定的其他对象的状态也被设置为发信号之前,不会获得所有权。同时,其他一些线程可能会获得互斥对象的所有权,从而将其状态设置为非信号。
提醒等待功能
SignalObjectAndWait,SignalObjectAndWait,WaitForMultipleObjectsEx ,和WaitForSingleObjectEx功能与其他等待功能不同,因为它们可以选择执行【警报等待操作】.在可警告的等待操作中,当满足指定的条件时,该函数可以返回,但是如果系统对I / O完成例程或APC执行排队等待线程执行,则该函数也可以返回。有关可警告等待操作和I / O完成例程的更多信息,请参阅同步和重叠输入和输出.有关APC的更多信息,请参阅异步过程调用.
等待功能和同步对象
在返回之前,wait函数可以修改某些类型的同步对象的状态。修改仅针对信号状态导致功能返回的对象或对象。等待功能可以修改同步对象的状态如下:
*信号量对象的计数减1,如果信号量的计数为零,信号量的状态将被设置为非信号。
*互斥量,自动复位事件和变更通知对象的状态设置为非指定状态。
*同步定时器的状态设置为非信号状态。
*手动复位事件,手动复位定时器,进程,线程和控制台输入对象的状态不受等待功能的影响。
等待功能和DDE
使用等待功能和DDE时必须要小心。如果一个线程创建任何窗口,它必须处理消息。DDE向系统中的所有窗口发送消息。如果您的线程使用等待功能,没有超时间隔,系统将会死锁。因此,如果您有一个创建窗口的线程,请使用MsgWaitForMultipleObjects或MsgWaitForMultipleObjectsEx,而不是其他等待功能。