В некоторых случаях потоку необходимо ждать,
пока другие-потоки не завершат выполнение
каких-то операций или не произойдет какое-либо
событие (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). |