случаях потоку необходимо ждать, пока
В некоторых
случаях потоку необходимо ждать, пока другие-потоки не завершат выполнение каких-то
операций или не произойдет какое-либо событие (UI-событие User Interface), то
есть событие, инициированное пользователем. В качестве примера, предположим,
что имеется 50 выходных телефонных портов и каждый из них управляется отдельным
потоком. Пусть класс ccaller для управления соединениями (звонками) уже разработан.
Есть также выделенный поток, который управляет всеми портами и отслеживает их
статус. Допустим, что до того, как сделать какой-нибудь звонок (call), надо
инициализировать все потоки. Тогда алгоритм ожидания множественного события
может выглядеть так, как показано ниже. В рассматриваемом фрагменте предполагается,
что объект СЕ vent m_nTotalCallers; уже существует и должным образом инициализирован:
//=======
Цикл по всем портам
for
(int i = 0; i<m_nTotalCallers; i++)
{
//===
Предварительные установки и создание потоков
CCaller
* pCaller = new CCaller(Лпараметры*/);
BOOL
bRc = pCaller->CreateThread();
}
//=======
Блокировка
CSingleLock
lock (Sm_CallersReadyEvent) ;
//=======
Попытка дождаться события
if
(lock.Lock(WAIT_VERY_LONG_TIME))
{
for
(i=0; i<m_nTotalCallers; i++)
{
//=====
Совершение соединений (звонков)
)
lock.Unlock();
}
else
// Отказ ждать
{
//======
Обработка исключения
}
Класс CEvent
представляет функциональность синхронизирующего объект ядра (события). Он позволяет
одному потоку уведомить (notify) другой поток о том, что произошло событие,
которое тот поток, возможно, ждал. Например, поток, копирующий данные в архив,
должен быть уведомлен о том, что поступили новые данные. Использование объекта
класса CEvent позволяет справиться с этой задачей максимально быстро.
Существуют
два типа объектов: ручной (manual) и автоматический (automatic). Ручной
объект начинает сигнализировать, когда будет вызван метод SetEvent. Вызов ResetEvent
переводит его в противоположное состояние. Автоматический объект класса CEvent
не нуждается в сбросе. Он сам переходит в состояние nonsignaled, и охраняемый
код при этом недоступен, когда хотя бы один поток был уведомлен о наступлении
события. Объект «событие» (CEvent) тоже используется совместно с объектом блокировка
(CSingleLock или CMultiLock).