Программирование для Windows NT

       

Ожидание завершения нескольких задач или процессов


Часто одна задача должна дожидаться завершения сразу нескольких задач или процессов, либо одной из нескольких задач или процессов. Такое ожидание нетрудно выполнить с помощью функции WaitForMultipleObjects, прототип которой приведен ниже:

DWORD WaitForMultipleObjects(

  DWORD cObjects,     // количество идентификаторов в массиве

  CONST HANDLE *lphObjects, // адрес массива идентификаторов

  BOOL  fWaitAll,           // тип ожидания

  DWORD dwTimeout);         // время ожидания в миллисекундах

Через параметр lphObjects функции WaitForMultipleObjects нужно передать адрес массива идентификаторов. Размер этого массива передается через параметр cObjects.

Если содержимое параметра fWaitAll равно TRUE, задача переводится в состояние ожидания до тех пор, пока все задачи или процессы, идентификаторы которых хранятся в массиве lphObjects, не завершат свою работу. В том случае, когда значение параметра fWaitAll равно FALSE, ожидание прекращается, когда одна из указанных задач или процессов завершит свою работу. Для выполнения бесконечного ожидания, как и в случае функции WaitForSingleObject, через параметр dwTimeout следует передать значение INFINITE.

Как пользоваться этой функцией?

Пример вы можете найти в исходных текстах приложеения MultiSDI, описанного ранее.

Прежде всего вам необходимо подготовить массив для хранения идентификаторов задач или процессов, завершения которых нужно дождаться:

HANDLE hThreads[3];

После этого в массив следует записать идентификаторы запущенных задач или процессов:

hThreads[0] = (HANDLE)_beginthread(PaintEllipse, 0,

  (void*)hWnd);

hThreads[1] = (HANDLE)_beginthread(PaintRect,    0,

  (void*)hWnd);

hThreads[2] = (HANDLE)_beginthread(PaintText,    0,

  (void*)hWnd);

Для выполнения ожидания следует вызвать функцию WaitForMultipleObjects, передав ей количество элементов в массиве идентификаторов, адрес этого массива, тип и время ожидания:

WaitForMultipleObjects(3, hThreads, TRUE, INFINITE);

В данном случае задача, вызвавшая функцию WaitForMultipleObjects, перейдет в состояние ожидания до тех пор, пока все три задачи не завершат свою работу.

Функция WaitForMultipleObjects может вернуть одно из следующих значений:

  • WAIT_FAILED (при ошибке);
  • WAIT_TIMEOUT (если время ожидания истекло);
  • значение в диапазоне от WAIT_OBJECT_0 до (WAIT_OBJECT_0 + cObjects - 1), которое, в зависимости от содержимого параметра fWaitAll, либо означает что все ожидаемые идентификаторы перешли в отмеченное состояние (если fWaitAll был равен TRUE), либо это значение, если из него вычесть константу WAIT_OBJECT_0, равно индексу идентификатора отмеченного объекта в массиве идентфикаторов lphObjects.
  • значение в диапазоне от WAIT_ABANDONED_0 до (WAIT_ABANDONED_0 + cObjects - 1), если ожидание для объектов Mutex было отменено. Индекс соответствующего объекта в массиве lphObjects можно определить, если вычесть из кода возврата значение WAIT_ABANDONED_0.


  • Содержание раздела