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

События

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

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

События

 

События

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

 


Содержание сайта (выборка)
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, справочник программиста
Яндекс цитирования