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


Функция WaitForMultipleObjects (synchapi.h)

Ожидает, пока один или все указанные объекты находятся в сигнальном состоянии или интервале ожидания.

Чтобы ввести оповещенное состояние ожидания, используйте функцию WaitForMultipleObjectsEx.

Синтаксис

DWORD WaitForMultipleObjects(
  [in] DWORD        nCount,
  [in] const HANDLE *lpHandles,
  [in] BOOL         bWaitAll,
  [in] DWORD        dwMilliseconds
);

Параметры

[in] nCount

Число дескрипторов объектов в массиве, на которое указывает lpHandles. Максимальное количество дескрипторов объектов — MAXIMUM_WAIT_OBJECTS. Этот параметр не может быть нулевым.

[in] lpHandles

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

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

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

[in] bWaitAll

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

[in] dwMilliseconds

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

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

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

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

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

Возврат кода или значения Описание
WAIT_OBJECT_0 (WAIT_OBJECT_0 + nCount– 1)
Если bWaitAllTRUE, возвращаемое значение в указанном диапазоне указывает, что состояние всех указанных объектов сигнализирует.

Если bWaitAllFALSE, возвращаемое значение минус WAIT_OBJECT_0 указывает индекс массива lpHandles массива объекта, удовлетворяющего ожиданию. Если во время вызова сигнализировало несколько объектов, это индекс массива сигнального объекта с наименьшим значением индекса всех сигнальных объектов.

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

Если bWaitAllFALSE, возвращаемое значение минус WAIT_ABANDONED_0 указывает индекс массива lpHandles заброшенного объекта мьютекса, который удовлетворил ожидание. Владение объектом мьютекса предоставляется вызывающему потоку, а мьютекс имеет значение nonsignalaled.

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

WAIT_TIMEOUT
0x00000102L
Интервал времени ожидания истек и условия, указанные параметром bWaitAll, не удовлетворены.
WAIT_FAILED
(DWORD)0xFFFFFFFF
Сбой функции. Чтобы получить расширенные сведения об ошибке, вызовите GetLastError.

Замечания

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

Если bWaitAllTRUE, операция ожидания функции завершается только в том случае, если состояние всех объектов было задано для сигнала. Функция не изменяет состояния указанных объектов до тех пор, пока состояния всех объектов не будут заданы для сигнала. Например, мьютекс может быть сигнален, но поток не получает владение до тех пор, пока состояния других объектов также не будут сигнализировать. В то же время некоторый другой поток может получить владение мьютексом, тем самым задав его состояние незначаемым.

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

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

Чтобы ожидать более MAXIMUM_WAIT_OBJECTS дескрипторов, используйте один из следующих методов:

  • Создайте поток для ожидания MAXIMUM_WAIT_OBJECTS дескрипторов, а затем дождитесь этого потока и других дескрипторов. Используйте этот метод для разбиения дескрипторов на группы MAXIMUM_WAIT_OBJECTS.
  • Вызовите RegisterWaitForSingleObject или SetThreadpoolWait, чтобы дождаться каждого дескриптора. Пул потоков эффективно ожидает дескриптора и назначает рабочий поток после того, как объект будет сигнализировать или истекает интервал времени ожидания.
Функция WaitForMultipleObjects может указывать дескриптор любого из следующих типов объектов в массиве lpHandles:
  • Уведомление об изменении
  • Входные данные консоли
  • Событие
  • Уведомление о ресурсе памяти
  • Мьютекс
  • Процесс
  • Семафор
  • Нить
  • Таймер ожидания
Используйте осторожность при вызове функций ожидания и кода, которые напрямую или косвенно создают окна. Если поток создает какие-либо окна, он должен обрабатывать сообщения. Трансляции сообщений отправляются во все окна в системе. Поток, использующий функцию ожидания без интервала времени ожидания, может привести к взаимоблокировке системы. Два примера кода, который косвенно создает окна, являются DDE и функция CoInitialize. Таким образом, если у вас есть поток, создающий окна, используйте msgWaitForMultipleObjects или MsgWaitForMultipleObjectsEx, а не WaitForMultipleObjects.

Примеры

Пример см. в разделе Ожидание нескольких объектов.

Требования

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

См. также

WAIT_ABANDONED_0

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

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