Поделиться через


Функция MsgWaitForMultipleObjectsEx (winuser.h)

Ожидает, пока один или все указанные объекты находятся в сигнальном состоянии, подпрограмма завершения ввода-вывода или асинхронный вызов процедуры (APC) помещается в очередь в поток или истекает интервал времени ожидания. Массив объектов может включать входные объекты событий, которые указываются с помощью параметра 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 минус один. Если этот параметр имеет нулевое значение, функция ожидает только входного события.

[in] pHandles

Массив дескрипторов объектов. Список типов объектов, дескриптор которых можно указать, см. в разделе "Примечания" далее в этом разделе. Массив может содержать дескриптор для нескольких типов объектов. Он может не содержать несколько копий одного дескриптора.

Если один из этих дескрипторов закрыт, пока ожидание по-прежнему ожидается, поведение функции не определено.

Дескриптор должен иметь право доступа SYNCHRONIZE. Дополнительные сведения см. в стандартных прав доступа.

[in] dwMilliseconds

Интервал времени ожидания в миллисекундах. Если задано ненулевое значение, функция ожидает, пока указанные объекты не будут сигнализировать, подпрограмма завершения ввода-вывода или APC находится в очереди или интервал истекает. Если dwMilliseconds равно нулю, функция не вводит состояние ожидания, если критерии не выполнены; он всегда возвращается немедленно. Если dwMillisecondsINFINITE, функция возвращается только в том случае, если указанные объекты сигнализируются или выполняется подпрограмма завершения ввода-вывода или APC.

Windows XP, Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2: значение dwMilliseconds включает время, затраченное на низкое питание. Например, время ожидания сохраняет подсчет во время сна компьютера.

Windows 8, Windows Server 2012, Windows 8.1, Windows Server 2012 R2, Windows 10 и Windows Server 2016: dwMilliseconds значение не включает время, потраченное в состояниях низкой мощности. Например, время ожидания не сохраняет подсчет времени ожидания во время сна компьютера.

[in] dwWakeMask

Входные типы, для которых будет добавлен дескриптор объекта входного события в массив дескрипторов объектов. Этот параметр может быть любым сочетанием значений, перечисленных в параметре GetQueueStatus.

[in] dwFlags

Тип ожидания. Этот параметр может быть одним или несколькими из следующих значений.

Ценность Значение
0
Функция возвращается, когда сигнализирует любой из объектов. Возвращаемое значение указывает объект, состояние которого привело к возврату функции.
MWMO_ALERTABLE
0x0002
Функция также возвращает, если APC был помещен в очередь в поток с QueueUserAPC, пока поток находится в состоянии ожидания.
MWMO_INPUTAVAILABLE
0x0004
Функция возвращается, если входные данные существуют для очереди, даже если входные данные были замечены (но не удалены) с помощью вызова другой функции, например PeekMessage.
MWMO_WAITALL
0x0001
Функция возвращается, когда все объекты в массиве pHandles сигнализируются, а входное событие получено одновременно.

Возвращаемое значение

Если функция выполнена успешно, возвращаемое значение указывает событие, вызвавшее возвращаемую функцию. Это может быть одно из следующих значений. (Обратите внимание, что WAIT_OBJECT_0 определяется как 0 и WAIT_ABANDONED_0 определяется как 0x000000080L.)

Возврат кода или значения Описание
WAIT_OBJECT_0 (WAIT_OBJECT_0 + nCount - 1)
Если используется флаг MWMO_WAITALL, возвращаемое значение в указанном диапазоне указывает, что состояние всех указанных объектов сигнализирует. В противном случае возвращаемое значение минус WAIT_OBJECT_0 указывает индекс массива pHandles объекта, вызвавшего возврат функции.
WAIT_OBJECT_0 + nCount
Новые входные данные типа, указанного в параметре dwWakeMask, доступны в очереди входных данных потока. Такие функции, как PeekMessage, GetMessage, GetQueueStatusи WaitMessage пометить сообщения в очереди как старые сообщения. Таким образом, после вызова одной из этих функций последующий вызов msgWaitForMultipleObjectsEx не возвращается до тех пор, пока не будет возвращен новый вход указанного типа.

Это значение также возвращается при возникновении системного события, требующего действия потока, например активации переднего плана. Таким образом, MsgWaitForMultipleObjectsEx может возвращать, даже если для dwWakeMask имеет значение 0. Если это происходит, вызовите GetMessage или PeekMessage для обработки системного события перед попыткой вызова MsgWaitForMultipleObjectsEx.

WAIT_ABANDONED_0 (WAIT_ABANDONED_0 + nCount - 1)
Если используется флаг MWMO_WAITALL, возвращаемое значение в указанном диапазоне указывает, что состояние всех указанных объектов сигнализируется, а по крайней мере один из объектов является заброшенным объектом мьютекса. В противном случае возвращаемое значение минус WAIT_ABANDONED_0 указывает индекс массива pHandles заброшенного объекта мьютекса, вызвавшего возвращаемую функцию. Владение объектом мьютекса предоставляется вызывающему потоку, а мьютекс имеет значение nonsignalaled.

Если мьютекс защищает сведения о постоянном состоянии, необходимо проверить его согласованность.

WAIT_IO_COMPLETION
0x0000000C0L
Ожидание было завершено одним или несколькими пользовательским режимом асинхронные вызовы процедур (APC) в очередь в поток.
WAIT_TIMEOUT
258L
Интервал времени ожидания истек, но условия, указанные dwFlags и dwWakeMask параметры не выполнены.
WAIT_FAILED
(DWORD)0xFFFFFFFF
Сбой функции. Чтобы получить расширенные сведения об ошибке, вызовите GetLastError.

Замечания

Функция MsgWaitForMultipleObjectsEx определяет, выполнены ли условия, указанные dwWakeMask и dwFlags. Если условия не выполнены, вызывающий поток вводит состояние ожидания до тех пор, пока не будут выполнены условия условия ожидания или истек интервал времени ожидания.

Если dwFlags равно нулю, эта функция проверяет дескрипторы в массиве, начиная с индекса 0, пока один из объектов не будет сигнализован. Если несколько объектов становятся сигнализованными, функция возвращает индекс первого дескриптора в массиве, объект которого был сигнализован.

MsgWaitForMultipleObjectsEx не возвращается, если в очереди сообщений нет непрочитанных входных данных указанного типа после вызова функции для проверки очереди, если вы не используете флаг MWMO_INPUTAVAILABLE. Это связано с тем, что такие функции, как PeekMessage, GetMessage, GetQueueStatusи WaitMessage проверить очередь, а затем изменить сведения о состоянии очереди, чтобы входные данные больше не считались новыми. Последующий вызов MsgWaitForMultipleObjectsEx не возвращается до поступления новых входных данных указанного типа, если только не используется флаг MWMO_INPUTAVAILABLE. Если этот флаг не используется, существующие непрочитанные входные данные (полученные до последнего времени проверки очереди) игнорируются.

Функция изменяет состояние некоторых типов объектов синхронизации. Изменение происходит только для объекта или объектов, состояние которого привело к возврату функции. Например, система уменьшает количество объектов семафора на один. Дополнительные сведения см. в документации по отдельным объектам синхронизации.

Функция MsgWaitForMultipleObjectsEx может указывать дескриптор любого из следующих типов объектов в массиве pHandles:

  • Уведомление об изменении
  • Входные данные консоли
  • Событие
  • Уведомление о ресурсе памяти
  • Мьютекс
  • Процесс
  • Семафор
  • Нить
  • Таймер ожидания

Требования

Требование Ценность
минимальные поддерживаемые клиентские Windows XP [только классические приложения]
минимальный поддерживаемый сервер Windows Server 2003 [только классические приложения]
целевая платформа Виндоус
заголовка winuser.h (включая Windows.h)
библиотеки User32.lib
DLL User32.dll

См. также

Функции синхронизации

функции ожидания