на начало
На главную страницу
Форум   

Статья :: События

 

События

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

 

События

страницы в данном разделе 
Урок 12 Некоторые сведения об архитектуре Windows
Windows 2000 — многозадачная операционная система Уровни и платформы
Однозадачные операционные системы Многозадачные операционные системы
Процессы и потоки Приоритеты процессов
Приоритеты потоков Переключение потоков
Архитектура памяти Win32 Разделы адресного пространства
Подсистемы ОС Взаимодействие подсистем
Разделяемые ресурсы Стратегии решения проблемы
Транзакции Тупиковая ситуация (Deadlock)
Механизмы синхронизации Критические секции
COMPEBOOK.RU - Компьютерные электронные книги, электронные учебники События
Семафоры Блокировки (Locks)
Специальные блокировки Устранение тупиковых ситуаций


Содержание сайта (выборка)
Apache
Протоколы TCP/IP (принципы, протоколы и архитектура)



PHP, PELR, JSP
PHP
JavaServer Pages (JSP)

Базы данных
Основы mysql
СУБД INFORMIX
СУБД POSTGRES
Основы проектирования реляционных баз данных

HTML, javascript
Спецификация HTML 4.01
Каскадные Таблицы Стилей, Уровень 2
Клиентский JavaScript. Справочник.
JavaScript руководство пользователя
Серверный JavaScript 1.4. Руководство по Использованию.

Паскаль, C, C++, C#
GCC (примеры)
FAQ Валентинa Озеровa DELPHI
C



 
© faq.pp.ru, справочник программиста