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_ASYNCPROCHANDLEDEF_H 00015 #define CNTM_ASYNCPROCHANDLEDEF_H 00016 #include <Cntm/Utils/IntTypes.h> 00017 #include <Cntm/Exceptions/IllegalStateException.h> 00018 #include <Cntm/RefCount/RefPtr.h> 00019 #include <Cntm/Concurrency/ExecutionUnitHandle.h> 00020 #include <Cntm/Synchro/SynchroSpace.h> 00021 #include <Cntm/AsyncProc/BasicAsyncProc.h> 00022 00023 namespace Cntm 00024 { 00025 00026 namespace SpecUtils { class AsyncProcImpl; } 00027 00028 class AsyncProc; 00029 00030 /** 00031 * Хэндл асинхронной процедуры. Наследует класс хэндла единицы выполнения Cntm::ExecutionUnitHandle. Используется для управления асинхронной процедурой. 00032 * 00033 * С одной процедурой может быть связано несколько хэндлов. Класс хэндла поддерживает операции копирования. 00034 * 00035 * Через хэндл обеспечивается получение информации о состоянии выполнения асинхронной процедуры, запуск отсроченной процедуры, ожидание завершения процедуры и установка обработчика завершения. 00036 * 00037 * Данный класс обеспечивает многопоточность. 00038 * @author Овсеевич Р. 00039 * \ingroup AsyncProc 00040 */ 00041 class AsyncProcHandle: public ExecutionUnitHandle, public BasicAsyncProc 00042 { 00043 public: 00044 00045 /** 00046 * Конструктор по умолчанию. Создает хэндл, не связанный с асинхронной процедурой. 00047 */ 00048 AsyncProcHandle(): ExecutionUnitHandle() {} 00049 00050 /** 00051 * Тип асинхронной процедуры: потоковая, отложенная, прямая (см. перечисление Cntm::BasicAsyncProc::ProcType). 00052 */ 00053 ProcType Type() const; 00054 00055 /** 00056 * Возвращает значение флага "была ли запущена процедура". Для обычных процедур сразу после создания устанавливается в true, для отсроченных (Suspend...) - после их успешного запуска методом Start(). 00057 */ 00058 bool Started() const; 00059 00060 /** 00061 * Возвращает значение флага "завершилась ли процедура". Исходное значение - false. После выхода из асинхронного метода, указанного при создании устанавливается в true. 00062 */ 00063 bool Finished() const; 00064 00065 /** 00066 * Вовзращает флаг успешности завершения асинхронного метода. Если при выполнении асинхронного метода в нем было сгенерировано необработанное исключение, т.е. произошел выход из метода без возврата результата, то флаг содержит false, если произошел нормальный выход из метода оператором return или при достижении конца метода, то данный флаг содержит true. До завершения метода данный флаг содержит false. 00067 */ 00068 bool Success() const; 00069 00070 /** 00071 * Произвести запуск отсроченной асинхронной процедуры. Если запуск уже произведен, то ни каких действий не выполняется. 00072 * 00073 * Для каждого из типов асинхронных процедур свой метод запуска. Для потоковых - создается новый поток, в котором происходит выполнение указанного асинхронного метода. Для отложенных - производится подготовка синхронизированного вызова указанного метода в указанном синхропространстве. Для прямых - непосредственный вызов указанного метода в методе Start(). Замечание: при прямом вызове все исключения, произошедшие в указанном при создании методе, будут проигнорированы. 00074 * 00075 * Исключение: SystemException - системная ошибка при создании нового потока (только для потоковых процедур). 00076 */ 00077 void Start(); 00078 00079 /** 00080 * Ожидать завершения выполнения асинхронной процедуры. Ожидание может длиться либо бесконечно до завершения, либо указанный интервал времени. В последнем случае возвращается результат ожидания: true - процедура завершилась, false - нет. 00081 * 00082 * Предупреждение. Использование ожидания внутри синхропространства д.б. предельно аккуратным, т.к. если, например, начато ожидание внутри синхропространства, а асинхронный метод тоже захочет войти в это же синхропространство, то произойдет взаимоблокировка, приводящая к зависанию. 00083 * 00084 * Исключение: SystemException - в случае системной ошибки при ожидании. 00085 * @param MSecTimeout - интервал ожидания завершения асинхронной процедуры в мс. Если значение не указано,то ожидание будет длится до завершения процедуры. 00086 */ 00087 bool Wait(uint MSecTimeout = tmInfinite); 00088 00089 /** 00090 * Установить обработчик завершения. Обработчик завершения это другая отсроченная асинхронная процедура. 00091 * 00092 * Если обработчик был установлен до завершения асинхронной процедуры, то его запуск (методом Start()) будет произведен непосредственно после выхода из асинхронного метода. Если он был установлен позже, то его запуск будет произведен непосредственно из данного метода. 00093 * 00094 * У асинхронной процедуры м.б. множество обработчиков завершения, повторные вызовы данного метода не влияют на уже установленные обработчики. 00095 * 00096 * Для удобства использования возвращается этот же объект (*this). 00097 * 00098 * Исключения: 00099 * BadArgException - если обработчик завершения находится в запущенном состоянии. 00100 * SystemException - системная ошибка при создании нового потока (только для потоковых процедур). 00101 * @param FinishProc - обработчик завершения. Является асинхронной процедурой которая не должна находиться в запущенном состоянии. 00102 */ 00103 AsyncProcHandle& SetFinishProc(const AsyncProcHandle& FinishProc); 00104 00105 /** 00106 * Метод аналогичен методу SetFinishProc. Данный метод принимает объект и метод и формирует отсроченную потоковую процедуру на основе указанных данных. В качестве аргумента указывается данный объект, что позволяет обработчику завершения получить результат выполнения. 00107 * 00108 * Сигнатура метода Method должна иметь вид: "void(const AsyncProcHandle& res)". 00109 * 00110 * Для удобства использования возвращается этот же объект. 00111 * 00112 * См. Cntm::AsyncProc::SuspendThread. 00113 * @param Object - объект-обработчик. Задается обычным указателем. 00114 * @param Method - метод объекта Object, который будет вызван синхронизированно в указанном синхропространстве. 00115 * @param Priority - приоритет потока, опционально, значение по умолчанию - tpNormal (см. перечисление Cntm::BasicAsyncProc::ThreadPriority). 00116 * @param HoldRef - хранить ли ссылку на объект Object, если это ссылочный объект. Параметр опциональный, значение по умолчанию - true. 00117 */ 00118 template < typename ClassT, typename MethodT > 00119 AsyncProcHandle& BindFinishToThreadProc(ClassT Object, 00120 MethodT Method, 00121 ThreadPriority Priority = tpNormal, 00122 bool HoldRef = true); 00123 00124 /** 00125 * Метод аналогичен методу SetFinishProc. Данный метод принимает объект и метод и формирует отсроченную отложенную процедуру на основе указанных данных. В качестве аргумента указывается данный объект, что позволяет обработчику завершения получить результат выполнения. 00126 * 00127 * Сигнатура метода Method должна иметь вид: "void(const AsyncProcHandle& res)". 00128 * 00129 * Для удобства использования возвращается этот же объект. 00130 * 00131 * См. Cntm::AsyncProc::SuspendDefer. 00132 * @param Object - объект-обработчик. Задается обычным указателем. 00133 * @param Method - метод объекта Object, который будет вызван синхронизированно в указанном синхропространстве. 00134 * @param Space - синхропространство, в котором будет выполнен метод. Если явно не указано, тоиспользуется синхропространство объекта Object, если это синхрообъект, иначе используется главное синхропространство. 00135 * @param HoldRef - хранить ли ссылку на объект Object, если это ссылочный объект. Параметр опциональный, значение по умолчанию - true. 00136 */ 00137 template < typename ClassT, typename MethodT > 00138 AsyncProcHandle& BindFinishToDeferProc(ClassT Object, 00139 MethodT Method, 00140 SynchroSpace::Ptr Space = SynchroSpace::Ptr(), 00141 bool HoldRef = true); 00142 00143 /** 00144 * Метод аналогичен методу SetFinishProc. Данный метод принимает объект и метод и формирует отсроченную прямую процедуру на основе указанных данных. В качестве аргумента указывается данный объект, что позволяет обработчику завершения получить результат выполнения. 00145 * 00146 * Сигнатура метода Method должна иметь вид: "void(const AsyncProcHandle& res)". 00147 * 00148 * Для удобства использования возвращается этот же объект. 00149 * 00150 * См. Cntm::AsyncProc::SuspendDirect. 00151 * @param Object - объект-обработчик. Задается обычным указателем. 00152 * @param Method - метод объекта Object, который будет вызван синхронизированно в указанном синхропространстве. 00153 * @param HoldRef - хранить ли ссылку на объект Object, если это ссылочный объект. Параметр опциональный, значение по умолчанию - true. 00154 */ 00155 template < typename ClassT, typename MethodT > 00156 AsyncProcHandle& BindFinishToDirectProc(ClassT Object, 00157 MethodT Method, 00158 bool HoldRef = true); 00159 00160 /** 00161 * Изменить значение параметра HoldRef, указанного при создании асинхронной процедуры. Это изменение имеет смысл только если указанный при создании объект - с подсчетом ссылок. Этот параметр влияет на хранение ссылки на объект, чей метод будет выполняться. Если параметр устанвлен в true, то на время выполнения метода ссылка на объект будет сохранена, если в false, то нет. 00162 * 00163 * Устанавливать этот параметр в false следует с большой осторожностью, т.к. может привести к уничтожению объекта во время выполнения метода. 00164 * @param HoldRef - хранить ли ссылку на объект, указанный при создании процедуры, если это ссылочный объект. 00165 */ 00166 void SetHoldRef(bool HoldRef); 00167 00168 protected: 00169 00170 typedef RefPtr<SpecUtils::AsyncProcImpl> AsyncProcImplPtr; 00171 00172 00173 /** 00174 * Конструктор инициализации. 00175 */ 00176 AsyncProcHandle(const AsyncProcImplPtr& Proc); 00177 00178 /** 00179 * Метод приведения к ссылочному указателю на объект асинхронной процедуры. 00180 */ 00181 AsyncProcImplPtr Proc() const; 00182 }; 00183 00184 } 00185 00186 #endif //CNTM_ASYNCPROCHANDLEDEF_H
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |