AsyncProcHandleDef.h

См. документацию.
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

SourceForge.net Logo
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой  doxygen 1.5.3