00001 /* 00002 * CntmLib - Подсчет ссылок, потоки, синхронизация, асинхронные процедуры, события 00003 * Copyright (c) 2005, Овсеевич Роман, CntmLib@mail.ru 00004 * _______________________________________________________________________________ 00005 * Разрешено свободное использование, копирование, распространение, изменение 00006 * (изменение сведений об авторских правах запрещено). Запрещена продажа и 00007 * включение всей библиотеки или ее частей в другие библиотеки. В сведениях об 00008 * авторских правах на программу (или сведениях о программе, об авторах, 00009 * использованных средствах разработки и т.д.) должна быть указана информация 00010 * о библиотеке CntmLib, ее авторе и, возможно, сайте или email'е. 00011 * Библиотека поставляется "как есть", без каких-либо гарантий со стороны автора. 00012 */ 00013 00014 #ifndef CNTM_EXECUTIONUNITHANDLE_H 00015 #define CNTM_EXECUTIONUNITHANDLE_H 00016 #include <Cntm/Concurrency/Internal/ExecutionUnitImpl.h> 00017 00018 namespace Cntm 00019 { 00020 00021 /** 00022 * Класс хэндла единицы выполнения. Является базовым классом для хэндлов асинхронных процедур (класс Cntm::AsyncProcHandle) и потоков активных объектов (класс Cntm::ActiveThreadHandle). 00023 * 00024 * Хэндл служит для управления асинхронной процедурой или потоком со стороны создателя единицы выполнения. По сути хэндл является ссылочным указателем на объект единицы выполнения, т.е. пока существует хотя бы один хэндл, связанный с объектом единицы выполнения, этот объект будет существовать. 00025 * 00026 * Хэндл может быть связан с единицей выполнения или нет. Это можно определить через свойство Assigned(). Разорвать связь между хэндлом и объектом единицы выполнения можно методом Unassign(). Также связь разрушается, когда происходит уничтожение хэндла. Значения хэндлов могут быть скопированы друг в друга. В этом случае связь со старым объектом разрывается и производится связь с тем объектом, с которым связан источник. 00027 * 00028 * Сам по себе объект единицы исполнения не доступен. Все управление этими объектами производится через их хэндлы (создание асинхронных процедур и потоков активных объектов производится с помощью статических методов классов Cntm::AsyncProc и Cntm::ActiveThread, которые возвращают хэндлы созданных ими объектов единиц выполнения). 00029 * 00030 * Данный класс является базовым классом хэндла и предоставляет сервис по установке флага принудительного останова - метод Terminate(). 00031 * 00032 * Класс поддерживает многопоточность. 00033 * @author Овсеевич Р. 00034 * \ingroup Concurrency 00035 */ 00036 class ExecutionUnitHandle 00037 { 00038 public: 00039 00040 /** 00041 * Тип идентификатора единицы выполнения. С помощью идентификаторов можно определить, относятся ли хэндлы к одной и той же единице выполнения или нет. 00042 * 00043 * Тип имеет операторы сравнения, поэтому может использоваться для сортировки. Не имеет конструктора по умолчанию, поэтому при создании переменной этого типа она д.б. явно проинициализирована, например, специальным значением ExecutionUnitHandle::NullId(). 00044 * 00045 * Значения идентификаторов могут быть использованы повторно после уничтожения единицы выполнения. 00046 */ 00047 typedef void* UnitId; 00048 00049 /** 00050 * Конструктор по умолчанию. Создает пустой хэндл, не связанный с единицей выполнения. 00051 */ 00052 ExecutionUnitHandle() {} 00053 00054 /** 00055 * Конструктор копирования. Дублирует указанный хэндл. 00056 * @param Src - дублируемый хэндл. 00057 */ 00058 ExecutionUnitHandle(const ExecutionUnitHandle& Src): impl(Src.impl) {} 00059 00060 /** 00061 * Специальное значение идентификатора единицы выполнения, означающее ее отсутствие. 00062 */ 00063 static UnitId NullId() { return NULL; } 00064 00065 /** 00066 * Оператор присвоения. Уничтожает связь со старым объектом единицы выполнения и устанавливает с новым, взятым из Src. 00067 * @param Src - дублируемый хэндл. 00068 */ 00069 ExecutionUnitHandle& operator= (const ExecutionUnitHandle& Src) { impl = Src.impl; return *this; } 00070 00071 /** 00072 * Идентификатор текущей единицы выполнения или NullId(), если хэндл не связан с единицей выполнения. 00073 */ 00074 UnitId Id() const { return impl.Pointer(); } 00075 00076 /** 00077 * Возвращает true, если хэндл связан с единицей выполнения и false - в противном случае. 00078 */ 00079 bool Assigned() const { return (bool)impl; } 00080 00081 /** 00082 * Возвращает флаг принудительного останова. Если хэндл не связан с единицей выполнения, то всегда возвращается false. 00083 */ 00084 bool Terminated() const { SpecUtils::ExecutionUnitImpl::Ptr temp = impl; return temp? temp->Terminated() : false; } 00085 00086 /** 00087 * Разорвать связь с единицей выполнения. После этого Assigned() будет возвращать false. 00088 * 00089 * Не генерирует исключений. 00090 */ 00091 void Unassign() throw() { impl.SetNull(); } 00092 00093 /** 00094 * Установить флаг принудительного завершения. Исходное значение этого флага - false. После вызова этого метода Terminated() и Cntm::ExecutionUnit::Terminated() вернут true, а Cntm::ExecutionUnit::CheckTerminating() сгенерирует исключение (примечание: методы объекта Cntm::ExecutionUnit должны быть вызваны в контексте той исполняемой единицы, с которой связан хэндл). 00095 * 00096 * Если хэндл не связан с единицей выполнения, то ни каких действий не выполняется. 00097 * 00098 * Не генерирует исключений. 00099 */ 00100 void Terminate() throw() { SpecUtils::ExecutionUnitImpl::Ptr temp = impl; if (temp) temp->Terminate(); } 00101 00102 protected: 00103 00104 /** 00105 * Защищенный конструктор инициализации хэндла. 00106 */ 00107 ExecutionUnitHandle(const SpecUtils::ExecutionUnitImpl::Ptr& Impl): impl(Impl) {} 00108 00109 /** 00110 * Ссылочный указатель на объект единицы выполнения. 00111 */ 00112 SpecUtils::ExecutionUnitImpl::Ptr impl; 00113 }; 00114 00115 } 00116 00117 #endif //CNTM_EXECUTIONUNITHANDLE_H
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |