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