манде указывается максимальное время ожидания. Чтобы обеспечить бесконечное
ожидание, в качестве временного интервала следует задать значение
INFINITE.
Если объект уже доступен или если он подает сигнал в течение задан-
ного времени, функция WaitForSingleObject() возвращает значение 0 и выполнение
потока возобновляется. Но если заданный интервал времени прошел, а объект не
подал сигнала, функция возвращает значение WAIT_TIMEOUT.
Будьте внимательны, задавая в качестве значения интервала ожидания
константу INFINITE.
Если по какой-либо причине объект никогда не подаст
сигнала, поток никогда не сможет возобновить своего выполнения. Кроме то-
го, если два потока будут введены в режим бесконечного ожидания сигнала
друг от друга, возникнет тупиковая ситуация.
Для того чтобы заставить поток ожидать сигналы сразу от нескольких
объектов, воспользуйтесь функцией WaitForMultipleObjects(). Функция возвра-
тит управление потоку при поступлении сигнала либо от одного из указанных
объектов, либо от всех объектов вместе. В программе, управляемой события-
ми, должен быть задан массив объектов:
DWORD WaitForMultipleObjects
(DWORD dwNumObjects, // количество ожидаемых объектов
LPHAMDLE lpHandles, // массив дескрипторов
BOOL bWaitAll, // TRUE – ожидание сигналов сразу от всех объектов;
// FALSE – ожидание сигнала от любого из объектов
DWORD dwMilliseconds, // максимальный период ожидания);…
Результирующее значение WAIT_TIMEOUT опять-таки говорит о том, что
заданный интервал времени прошел, а сигнал от объектов не поступил. Если флаг
bWaitAll имеет значение FALSE,
соответствующее ожиданию сигнала от любого
из указанных объектов, в случае успешного завершения функция WaitForMultip-
leObjects() возвращает код, который указывает, от какого из элементов массива
lpHandles поступил сигнал. (Первый элемент массива соответствует значению 0,
второй – значению 1 и т. д.) Если флаг bWaitАll имеет значение TRUE,
функция не
возвращает результат до тех пор, пока не будут установлены флаги всех объектов
(т. е. пока не завершите выполнения всех потоков).
Две расширенные версии функций ожидания содержат дополнительный
флаг статуса оповещения, который позволяет возобновить выполнение потока,
если в течение периода ожидания были завершены асинхронные операции
чтения или записи. Работу этих функций можно представить так, как будто
они просят «разбудить» их в одном из трех случаев: если становится доступ-
ным указанный объект; если заканчивается заданный период времени; если за-
вершилось выполнение фоновой операции ввода/вывода:
DWORD WaitForSingleObjectEx
(HANDLE hObject, // объект, сигнал от которого ожидается
DWORD dwMilliseconds, // максимальное время ожидания
BOOL bAlertable // TRUE – прекращение ожидания
// при завершении операции ввода/вывода);
29