MFC 线程同步MsgWaitForMultipleObjects Function

1、作用

等待,直到一个或所有指定的对象处于信号状态或超时间隔过去。这些对象可以包括输入事件对象,您可以使用dwWakeMask参数指定这些对象。

2、函数原型

DWORD MsgWaitForMultipleObjects(
  [in] DWORD        nCount,
  [in] const HANDLE *pHandles,
  [in] BOOL         fWaitAll,
  [in] DWORD        dwMilliseconds,
  [in] DWORD        dwWakeMask
);

DWORD MsgWaitForMultipleObjectsEx(
  [in] DWORD        nCount,
  [in] const HANDLE *pHandles,
  [in] DWORD        dwMilliseconds,
  [in] DWORD        dwWakeMask,
  [in] DWORD        dwFlags
);

[in] nCount

pHandles所指向的数组中的对象句柄数。对象句柄的最大数目为 MAXIMUM_WAIT_OBJECTS减去 1。如果此参数的值为零,则该函数仅等待输入事件。

[in] pHandles

对象句柄数组。有关可以指定其句柄的对象类型的列表,请参阅以下"备注"部分。数组可以包含不同类型的对象的句柄。它不能包含同一句柄的多个副本。

如果其中一个句柄在等待仍处于挂起状态时关闭,则函数的行为未定义。

[in] fWaitAll

如果此参数为 TRUE,则当pHandles数组中所有对象的状态都设置为已发出信号并已收到输入事件时,该函数将返回。如果此参数为 FALSE,则当任何一个对象的状态设置为信令或已收到输入事件时,该函数将返回。在这种情况下,返回值指示其状态导致函数返回的对象。

[in] dwMilliseconds

超时间隔,以毫秒为单位。如果指定了非零值,则该函数将一直等待,直到向指定的对象发出信号或间隔过去。如果dw毫秒为零,则在未向指定对象发出信号时,函数不会进入等待状态;它总是立即返回。如果dw毫秒INFINITE,则函数只有在向指定的对象发出信号时才会返回。

[in] dwWakeMask

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

价值意义

QS_ALLEVENTS

0x04BF

输入、WM_TIMER、WM_PAINT、WM_HOTKEY或发布的消息都在队列中。

此值是 QS_INPUT 、 QS_POSTMESSAGE、 QS_TIMER、 QS_PAINTQS_HOTKEY的组合。


QS_ALLINPUT

0x04FF

任何消息都在队列中。

此值是QS_INPUT、 QS_POSTMESSAGE、 QS_TIMER、 QS_PAINT、 QS_HOTKEYQS_SENDMESSAGE的组合。


QS_ALLPOSTMESSAGE

0x0100

队列中有已发布的消息。

当您调用GetMessagePeekMessage而不筛选邮件时,将清除此值。


QS_HOTKEY

0x0080

队列中有WM_HOTKEY消息。

QS_INPUT

0x407

输入消息在队列中。

此值是 QS_MOUSE 、 QS_KEYQS_RAWINPUT的组合。


QS_KEY

0x0001

WM_KEYUP、WM_KEYDOWN、WM_SYSKEYUP或WM_SYSKEYDOWN消息都在队列中。

QS_MOUSE

0x0006

WM_MOUSEMOVE消息或鼠标按钮消息(WM_LBUTTONUP、WM_RBUTTONDOWN等)。

此值是QS_MOUSEMOVEQS_MOUSEBUTTON的组合。


QS_MOUSEBUTTON

0x0004

鼠标按钮消息(WM_LBUTTONUP、WM_RBUTTONDOWN等)。

QS_MOUSEMOVE

0x0002

队列中有WM_MOUSEMOVE消息。

QS_PAINT

0x0020

队列中有WM_PAINT消息。

QS_POSTMESSAGE

0x0008

队列中有已发布的消息。

QS_RAWINPUT

0x0400

原始输入消息位于队列中。

QS_SENDMESSAGE

0x0040

队列中包含由其他线程或应用程序发送的消息。

QS_TIMER

0x0010

队列中有WM_TIMER消息。

MsgWaitForMultipleObjectsEx参数:[in] dwFlags

价值意义

0

当任何一个对象收到信号时,该函数将返回。返回值指示其状态导致函数返回的对象。

MWMO_ALERTABLE

0x0002

如果 APC 在线程处于等待状态时已排队到具有QueueUserAPC的线程,则该函数也会返回。

MWMO_INPUTAVAILABLE

0x0004

如果队列存在输入,则该函数将返回,即使已使用对另一个函数(如PeekMessage)的调用看到(但未删除)输入也是如此。

MWMO_WAITALL

0x0001

pHandles数组中的所有对象都同时收到信号并收到输入事件时,该函数将返回。

3、返回值

返回代码/值描述

WAIT_OBJECT_0到 (WAIT_OBJECT_0 + nCount– 1)

如果bWaitAll 为 TRUE,则指定范围内的返回值表示所有指定对象的状态都已发出信号。如果bWaitAll 为 FALSE,则返回值减去WAIT_OBJECT_0表示满足等待的对象的pHandles数组索引。

WAIT_OBJECT_0 + nCount

dwWakeMask参数中指定的类型的新输入在线程的输入队列中可用。诸如 PeekMessage、GetMessage和 WaitMessage等函数会将队列中的消息标记为旧消息。因此,在调用这些函数之一后,对MsgWaitForMultipleObjects的后续调用将不会返回,直到指定类型的新输入到达。

在发生需要线程操作的系统事件(如前台激活)时,也会返回此值。因此,MsgWaitForMultipleObjects可以返回,即使没有适当的输入可用,即使dwWakeMask设置为 0。如果发生这种情况,请调用GetMessagePeekMessage来处理系统事件,然后再次尝试调用MsgWaitForMultipleObjects。

WAIT_ABANDONED_0到 (WAIT_ABANDONED_0 + nCount– 1)

如果bWaitAll 为 TRUE,则指定范围内的返回值表示所有指定对象的状态都已发出信号,并且其中至少有一个对象是废弃的互斥体对象。如果bWaitAll 为 FALSE,则返回值减去WAIT_ABANDONED_0表示满足等待的废弃互斥对象的pHandles数组索引。互斥对象的所有权授予调用线程,互斥体设置为非信号。

如果互斥体正在保护持久状态信息,则应检查其一致性。

WAIT_TIMEOUT

258L

未满足经过的超时间隔以及bWaitAlldwWakeMask参数指定的条件。

WAIT_FAILED

0xFFFFFFFF

函数已失败。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值