[New - Windows NT]
SignalObjectAndWait函数允许调用者以原子方式发送一个对象并等待另一个对象。
BOOL SignalObjectAndWait(
HANDLE 【hObjectToSignal】, | //对象的句柄信号 |
HANDLE 【hObjectToWaitOn】, | //处理对象等待 |
DWORD 【dwMilliseconds】, | //超时间隔(以毫秒为单位) |
BOOL 【bAlertable】 | // alertable标志 |
); |
参数
【hObjectToSignal】
指定要发送信号的对象的句柄。此对象可以是信号量,互斥体或事件。如果句柄是信号量,则需要SEMAPHORE_MODIFY_STATE访问。如果句柄是事件,则需要EVENT_MODIFY_STATE访问。如果句柄是互斥体,则假定SYNCHRONIZE访问,因为只有互斥体的所有者可能会释放它。有关详细信息,请参阅进程间同步对象.
【hObjectToWaitOn】
指定要等待的对象的句柄。有关可以指定句柄的对象类型的列表,请参阅本主题后面的备注部分。
【dwMilliseconds】
指定超时间隔(以毫秒为单位)。即使该对象的状态为非指定状态,也没有任何完成或异步过程调用(APC)对象排队,该函数返回该间隔。如果【dwMilliseconds】为零,则该函数测试对象的状态,检查排队的完成例程或APC,并立即返回。如果【dwMilliseconds】为INFINITE,则该函数的超时间隔从未过去。
【bAlertable】
指定当系统对I / O完成例程或调用线程的APC进行排队时,该函数是否返回。如果为TRUE,函数返回,线程调用完成例程或APC函数。如果为FALSE,则该函数不返回,线程不调用完成例程或APC功能。
返回值
如果函数成功,则返回值表示导致函数返回的事件。
如果函数失败,返回值为0xFFFFFFFF。要获取扩展错误信息,请调用GetLastError.
成功后,返回值为以下值之一:
值 | 含义 |
WAIT_ABANDONED | 指定的对象是一个互斥对象,该对象在所有线程终止之前未被拥有互斥对象的线程释放。互斥对象的所有权被授予调用线程,并且互斥体被设置为非指定的。 |
WAIT_IO_COMPLETION | 一个或多个I / O完成例程或用户模式APC排队等待执行。 |
WAIT_OBJECT_0 | 发出指定对象的状态。 |
WAIT_TIMEOUT | 超时间隔已经过去,对象的状态是非信号的。 |
备注
当指定的ReadFileEx或WriteFileEx功能已完成时,完成例程将排队执行。等待函数返回,只有【bAlertable】为TRUE时执行完成例程,调用线程是启动读或写操作的线程。
SignalObjectAndWait功能可以等待以下对象:
目的 | 描述 |
更改通知en | FindFirstChangeNotification函数返回句柄。在指定的目录或目录树中发生指定的更改时,将更改通知对象的状态设置为发出信号。 |
控制台输入 | 当指定CONIN $值时,由CreateFile函数返回句柄,或由GetStdHandle函数返回。当控制台的输入缓冲区中有未读输入时,对象的状态被设置为发信号,当输入缓冲区为空时,该状态为非信号。 |
事件 | CreateEvent或OpenEvent函数返回句柄。事件对象的状态被明确设置为由SetEvent或PulseEvent函数发出信号。手动复位事件对象的状态必须显式重置为ResetEvent功能的非指定状态。对于自动重置事件对象,等待功能在返回之前将对象状态重置为非指定状态。事件对象也用于重叠操作,其中状态由系统设置。 |
互斥 | CreateMutex或OpenMutex函数返回句柄。当互斥体对象的状态不被任何线程所拥有时,将被发出信号。等待功能请求调用线程的互斥体的所有权,在授予所有权时将互斥体状态更改为非指定状态。 |
处理 | CreateProcess或OpenProcess函数返回句柄。当进程终止时,发出进程对象的状态。 |
信号 | CreateSemaphore或OpenSemaphore函数返回句柄。一个信号量对象维持在零和在创建期间指定的最大计数之间的计数。它的状态设置为在其计数大于零时发出信号,并且当其计数为零时,它的状态被非信号化。如果发出信号量的当前状态,则等待功能将计数减1。 |
线 | CreateProcess,CreateThread或CreateRemoteThread函数返回句柄。当线程终止时,发出线程对象的状态。 |
计时器 | CreateWaitableTimer或OpenWaitableTimer函数返回句柄。通过调用SetWaitableTimer功能激活定时器。有效定时器的状态在达到适当的时间时发出信号。通过调用CancelWaitableTimer功能来停用定时器。 |
使用等待功能和DDE时必须要小心。如果一个线程创建任何窗口,它必须处理消息。DDE向系统中的所有窗口发送消息。如果您的线程使用等待功能,没有超时间隔,系统将会死锁。因此,如果您有一个创建窗口的线程,请使用MsgWaitForMultipleObjects或MsgWaitForMultipleObjectsEx而不是SignalObjectAndWait.
也可以看看
CancelWaitableTimer,CreateEvent,CreateMutex,CreateProcess,CreateThread,CreateRemoteThread,CreateSemaphore,CreateWaitableTimer, FindFirstChangeNotification,MsgWaitForMultipleObjects, MsgWaitForMultipleObjectsEx, OpenEvent,OpenMutex,OpenProcess,OpenSemaphore,OpenWaitableTimer, PulseEvent,ReadFileEx, ResetEvent, SetEvent, SetWaitableTimer, WriteFileEx