MsgWaitForMultipleObjects

【勇芳软件工作室】汉化HomePreviousNext

当发生以下其中一种情况时,MsgWaitForMultipleObjects函数返回:

*任何一个或所有指定的对象都处于信号状态。对象可以包括使用【dwWakeMask】参数指定的输入事件对象。

*经过了超时间隔。

请注意,如果队列中存在指定类型的以前未读的输入,则MsgWaitForMultipleObjects不返回。输入到达时才醒来。

DWORD MsgWaitForMultipleObjects(

DWORD 【NCOUNT】,//对象句柄数组中的句柄数
LPHANDLE 【蜡烛xh】,//指向object-handle数组的指针
BOOL 【fWaitAll】,//等待所有或等待一个
DWORD 【dwMilliseconds】,//超时间隔(以毫秒为单位)
DWORD 【dwWakeMask】//要等待的输入事件的类型
); 

参数

【NCOUNT】

指定【蜡烛xh】指向的数组中的对象句柄数。对象句柄的最大数量为MAXIMUM_WAIT_OBJECTS减1。

【蜡烛xh】

指向一组对象句柄。有关可以指定句柄的对象类型的列表,请参阅以下备注部分。该数组可以包含不同类型对象的句柄。

Windows NT:句柄必须具有SYNCHRONIZE访问权限。

【fWaitAll】

指定等待类型。如果为TRUE,当【蜡烛xh】数组中的所有对象的状态(包括输入事件)已设置为发出信号时,该函数将返回。如果FALSE,则当任何一个对象的状态设置为发信号时,该函数返回。在后一种情况下,返回值表示状态导致函数返回的对象。

【dwMilliseconds】

指定超时间隔(以毫秒为单位)。即使没有满足【fWaitAll】【dwWakeMask】参数指定的条件,该函数也将返回。如果【dwMilliseconds】为零,函数将测试指定对象的状态并立即返回。如果【dwMilliseconds】是INFINITE,则该函数的超时间隔从不会过去。

【dwWakeMask】

指定输入事件对象句柄将被添加到对象句柄数组的输入类型。此参数可以是以下值的任意组合:

含义
QS_ALLINPUT任何消息都在队列中。
QS_HOTKEY队列中有一个WM_HOTKEY消息。
QS_INPUT输入消息在队列中。
QS_KEYWM_KEYUP,WM_KEYDOWN,WM_SYSKEYUP或WM_SYSKEYDOWN消息在队列中。
QS_MOUSEWM_MOUSEMOVE消息或鼠标按钮消息(WM_LBUTTONUP,WM_RBUTTONDOWN等)。
QS_MOUSEBUTTON鼠标按钮消息(WM_LBUTTONUP,WM_RBUTTONDOWN等)。
QS_MOUSEMOVE一个WM_MOUSEMOVE消息在队列中。
QS_PAINT一个WM_PAINT消息在队列中。
QS_POSTMESSAGE发布的消息(除了刚刚列出的消息)在队列中。
QS_SENDMESSAGE另一个线程或应用程序发送的消息在队列中。
QS_TIMER队列中有WM_TIMER消息。

返回值

如果函数成功,则返回值表示导致函数返回的事件。成功的返回值是以下之一:

含义
WAIT_OBJECT_0到
(WAIT_OBJECT_0 + 【NCOUNT】 - 1)
如果【fWaitAll】为TRUE,则返回值表示指示了所有指定对象的状态。如果【fWaitAll】为FALSE,返回值减WAIT_OBJECT_0表示满足等待的对象的【蜡烛xh】数组索引。
WAIT_OBJECT_0 + 【NCOUNT】【dwWakeMask】参数中指定的类型的输入在线程的输入队列中可用。
WAIT_ABANDONED_0到
(WAIT_ABANDONED_0 + 【NCOUNT】 - 1)
如果【fWaitAll】为TRUE,则返回值指示所有指定对象的状态发出信号,并且至少一个对象是放弃的互斥对象。如果【fWaitAll】为FALSE,则返回值减WAIT_ABANDONED_0表示满足等待的已放弃互斥体对象的【蜡烛xh】数组索引。
WAIT_TIMEOUT超时时间间隔和【fWaitAll】【dwWakeMask】参数指定的条件不满足。

如果函数失败,返回值为0xFFFFFFFF。要获取扩展错误信息,请调用GetLastError.

备注

MsgWaitForMultipleObjects功能确定是否满足等待条件。如果没有满足标准,则呼叫线程进入有效的等待状态,在等待满足等待条件的条件时,使用很少的处理器时间。

在所有对象的状态都被设置为发出信号之前,该函数不会修改指定对象的状态。例如,可以用信号通知互斥体,但是直到其他对象的状态也被设置为发出信号,线程才会获得所有权。在此期间,其他线程可能会获得互斥体的所有权,从而将其状态设置为非指定状态。

【fWaitAll】为TRUE时,只有当所有对象的状态都被设置为发信号时,功能的等待才能完成,包括由【dwWaskMask】指定的输入事件。因此,将【fWaitAll】设置为TRUE可以防止在【蜡烛xh】数组中的所有对象的状态设置为发出信号之前对输入进行处理。因此,如果将【fWaitAll】设置为TRUE,则应在【dwMilliseconds】中使用短暂的超时值。如果您有一个线程可以创建等待【蜡烛xh】数组中所有对象的窗口,包括【dwWakeMask】指定的输入事件,并且没有超时间隔,系统将会死锁。这是因为创建窗口的线程必须处理消息。DDE向系统中的所有窗口发送消息。因此,如果线程创建窗口,则在从该线程调用MsgWaitForMultipleObjects的调用中不要将【fWaitAll】参数设置为TRUE。

在返回之前,wait函数修改某些类型的同步对象的状态。修改仅针对信号状态导致功能返回的对象或对象。例如,信号量对象的计数减1。

MsgWaitForMultipleObjects函数可以指定【蜡烛xh】数组中的任何以下对象类型的句柄:

目的描述
更改通知enFindFirstChangeNotification函数返回句柄。当指定的类型的更改发生在指定的目录或目录树中时,更改通知对象的状态被设置为发出信号。
控制台输入当指定CONIN $值时,CreateFile函数返回句柄,或GetStdHandle函数返回句柄。当控制台的输入缓冲区中有未读输入并且当输入缓冲区为空时,该对象的状态被设置为发信号通知非信号。
事件CreateEventOpenEvent函数返回句柄。事件对象的状态被明确设置为由SetEventPulseEvent函数发出信号。手动复位事件对象的状态必须显式重置为ResetEvent功能的非指定状态。对于自动重置事件对象,等待功能在返回之前将对象状态重置为非指定状态。事件对象也用于重叠操作,其中状态由系统设置。
互斥CreateMutexOpenMutex函数返回句柄。当互斥体对象的状态不被任何线程所拥有时,将被发出信号。等待功能请求调用线程的互斥体的所有权,在授予所有权时将互斥体状态更改为非指定状态。
处理CreateProcessOpenProcess函数返回句柄。过程对象的状态设置为在进程终止时发出信号。
信号CreateSemaphoreOpenSemaphore函数返回句柄。一个信号量对象维持在零和在创建期间指定的最大计数之间的计数。其状态设置为在计数大于零时发出信号,并在其计数为零时为非信号。如果发出信号量的当前状态,则等待功能将计数减1。
线CreateProcessCreateThreadCreateRemoteThread函数返回句柄。线程对象的状态设置为在线程终止时发出信号。
计时器CreateWaitableTimerOpenWaitableTimer函数返回句柄。通过调用SetWaitableTimer功能激活定时器。有效定时器的状态设置为在到达其时间时发出信号。您可以通过调用CancelWaitableTimer功能来停用定时器。

在某些情况下,您可以在【lpHandles】中将名为管道或通讯设备的文件的句柄指定为同步对象。但是,不鼓励用于此目的。

也可以看看

CancelWaitableTimer, CreateEvent, CreateFile, CreateMutex, CreateProcess, CreateRemoteThread, CreateSemaphore, CreateThread, FindFirstChangeNotification, GetStdHandle, MsgWaitForMultipleObjectsEx OpenEvent, OpenMutex, OpenProcess, OpenSemaphore, OpenWaitableTimer, PulseEvent, ResetEvent, SetEvent