Операционные системы. Учебное пособие. Марапулец Ю.В. - 69 стр.

UptoLike

Составители: 

Функция 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