[New - Windows NT]
当发生以下其中一种情况时,MsgWaitForMultipleObjectsEx函数返回:
*任何一个或所有指定的对象都处于信号状态。对象数组可以包括使用【dwWakeMask】参数指定的输入事件对象。
* I / O完成例程或异步过程调用(APC)排队等待线程。
*经过了超时间隔。
如果队列中指定类型的未读取输入为MsgWaitForMultipleObjectsEx函数,则不返回。仅当新输入到达时才返回。
DWORD MsgWaitForMultipleObjectsEx(
DWORD 【NCOUNT】, | //句柄数组中的句柄数 |
LPHANDLE 【蜡烛xh】, | //指向对象句柄数组的指针 |
DWORD 【dwMilliseconds】, | //超时间隔(以毫秒为单位) |
DWORD 【dwWakeMask】, | //要等待的输入事件的类型 |
DWORD 【dwFlags中】 | // wait flags |
); |
参数
【NCOUNT】
指定【蜡烛xh】指向的数组中的对象句柄数。对象句柄的最大数量为MAXIMUM_WAIT_OBJECTS减1。
【蜡烛xh】
指向一组对象句柄。有关可以指定句柄的对象类型的列表,请参阅本主题后面的备注部分。数组可以包含多种类型对象的句柄。
Windows NT:句柄必须具有SYNCHRONIZE访问权限。
【dwMilliseconds】
指定超时间隔(以毫秒为单位)。即使在【dwWakeMask】和【dwFlags中】参数指定的条件不符合的情况下,如果间隔过去,该函数返回。如果【dwMilliseconds】为零,函数将测试指定对象的状态并立即返回。如果【dwMilliseconds】为INFINITE,则该函数的超时间隔从不会过去。
【dwWakeMask】
指定输入事件对象句柄将被添加到对象句柄数组的输入类型。此参数可以是以下值的任意组合:
值 | 含义 |
QS_ALLINPUT | 任何消息都在队列中。 |
QS_HOTKEY | 队列中有一条WM_HOTKEY消息。 |
QS_INPUT | 输入消息在队列中。 |
QS_KEY | A WM_KEYUP,WM_KEYDOWN,WM_SYSKEYUP或WM_SYSKEYDOWN消息在队列中。 |
QS_MOUSE | WM_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消息。 |
【dwFlags中】
指定等待类型。此参数可以是以下值的任意组合:
值 | 含义 |
0 | 当任何一个对象发出信号时,该函数返回。返回值表示状态导致函数返回的对象。 |
MWMO_WAITALL | 当【蜡烛xh】数组中的所有对象同时发出信号时,该函数返回。 |
MWMO_ALERTABLE | 如果APC已经使用QueueUserAPC排队到线程,该函数也返回。 |
返回值
如果函数成功,则返回值表示导致函数返回的事件。成功的返回值是以下之一:
值 | 含义 |
WAIT_OBJECT_0到 (WAIT_OBJECT_0 + 【NCOUNT】 - 1) | 如果使用MWMO_WAITALL标志,则返回值表示所有指定对象的状态发出信号。否则,返回值减去WAIT_OBJECT_0表示导致该函数返回的对象的【蜡烛xh】数组索引。 |
WAIT_OBJECT_0 + 【NCOUNT】 | 在【dwWakeMask】参数中指定的类型的输入在线程的输入队列中可用。 |
WAIT_ABANDONED_0到 (WAIT_ABANDONED_0 + 【NCOUNT】 - 1) | 如果使用MWMO_WAITALL标志,则返回值表示所有指定对象的状态都发出信号,至少有一个对象是放弃的互斥对象。否则,返回值减WAIT_ABANDONED_0表示导致函数返回的已放弃的互斥对象的【蜡烛xh】数组索引。 |
WAIT_IO_COMPLETION | 等待由队列到线程的用户模式异步过程调用(APC)结束。 |
WAIT_TIMEOUT | 超时间隔已过,但不符合【dwFlags中】和【dwWakeMask】参数指定的条件。 |
如果函数失败,返回值为0xFFFFFFFF。要获取扩展错误信息,请调用GetLastError.
备注
MsgWaitForMultipleObjectsEx功能确定是否满足【dwWakeMask】和【dwFlags中】指定的条件。如果条件尚未满足,则调用线程进入有效的等待状态。该线程在等待满足条件之一或超时间隔期间使用非常少的处理器时间。
在返回之前,wait函数修改某些类型的同步对象的状态。修改仅针对信号状态导致功能返回的对象或对象。例如,系统将信号量对象的计数减少1。
MsgWaitForMultipleObjectsEx函数可以在【蜡烛xh】数组中指定以下任何对象类型的句柄:
目的 | 描述 |
更改通知en | FindFirstChangeNotification函数返回句柄。在指定的目录或目录树中发生指定的更改时,将更改通知对象的状态设置为发出信号。 |
控制台输入 | 当指定CONIN $值时,CreateFile函数返回句柄,或GetStdHandle函数返回句柄。当控制台的输入缓冲区中有未读输入并且当输入缓冲区为空时,该对象的状态被设置为发信号通知非信号。 |
事件 | CreateEvent或OpenEvent函数返回句柄。事件对象的状态被明确设置为由SetEvent或PulseEvent函数发出信号。手动复位事件对象的状态必须显式重置为ResetEvent功能的非指定状态。对于自动重置事件对象,等待功能在返回之前将对象状态重置为非指定状态。事件对象也用于重叠操作,其中状态由系统设置。 |
互斥 | CreateMutex或OpenMutex函数返回句柄。当互斥体对象的状态不被任何线程所拥有时,将被发出信号。等待功能请求调用线程的互斥体的所有权,在授予所有权时将互斥体状态更改为非指定状态。 |
处理 | CreateProcess或OpenProcess函数返回句柄。过程对象的状态设置为在进程终止时发出信号。 |
信号 | CreateSemaphore或OpenSemaphore函数返回句柄。一个信号量对象维持在零和在创建期间指定的最大计数之间的计数。其状态设置为在计数大于零时发出信号,并在其计数为零时为非信号。如果发出信号量的当前状态,则等待功能将计数减1。 |
线 | CreateProcess,CreateThread或CreateRemoteThread函数返回句柄。线程对象的状态设置为在线程终止时发出信号。 |
计时器 | CreateWaitableTimer或OpenWaitableTimer??函数返回句柄。通过调用SetWaitableTimer功能激活定时器。有效定时器的状态设置为在到达其时间时发出信号。您可以通过调用CancelWaitableTimer功能来停用定时器。 |
在某些情况下,您可以在【lpHandles】中将文件的句柄(称为管道)或通讯设备指定为同步对象。但是,不鼓励用于此目的。
也可以看看
CancelWaitableTimer, CreateEvent,CreateFile,CreateMutex,CreateProcess,CreateRemoteThread,CreateSemaphore,CreateThread,CreateWaitableTimer, FindFirstChangeNotification,GetStdHandle,MsgWaitForMultipleObjects,OpenEvent,OpenMutex,OpenProcess,OpenSemaphore, OpenWaitableTimer, PulseEvent, QueueUserAPC,ResetEvent,SetEvent,SetWaitableTimer