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