AsyncProcResultDef.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_ASYNCPROCRESULTDEF_H
00015 #define CNTM_ASYNCPROCRESULTDEF_H
00016 #include <Cntm/Utils/IntTypes.h>
00017 #include <Cntm/RefCount/RefPtr.h>
00018 #include <Cntm/AsyncProc/AsyncProcHandleDef.h>
00019 
00020 namespace Cntm
00021 {
00022 
00023         namespace SpecUtils { template <typename ResT> class AsyncProcResImpl; }
00024 
00025         /**
00026          * Класс для получения результата выполнения всинхронного метода, указанного при создании процедуры. Наследует все свойства и методы хэндла асинхронной процедуры. Является шаблонным классом, параметр шаблона - тип возвращаемого асинхронным методом значения.
00027          * 
00028          * С одной процедурой может быть связано несколько результатов. Класс результата поддерживает операции копирования и приведения к типу возвращаемого асинхронным методом значения.
00029          * 
00030          * Данный класс обеспечивает многопоточность.
00031          * @author Овсеевич Р.
00032          * \ingroup AsyncProc
00033          */
00034         template < typename ResT >
00035         class AsyncProcResult: public AsyncProcHandle
00036         {
00037         public:
00038         
00039                 /**
00040                  * Конструктор по умолчанию. Создает результат, не связанный с асинхронной процедурой. 
00041                  */
00042                 AsyncProcResult(): AsyncProcHandle() {}
00043                 
00044                 /**
00045                  * Получить значение результата асинхронного метода.
00046                  * 
00047                  * Значение результата становится доступным только после успешного завершения асинхронной процедуры. Если данный метод был вызван до завершения, то он производит ожидание завершения процедуры. Если выполнение закончилось удачно, то будет возвращено значение результата, в противном случае будет сгенерировано исключение Cntm::NoneAsyncResultException, т.к. значение результата уже никогда не будет получено.
00048                  * 
00049                  * Исключение: NoneAsyncResultException - попытка получения результата процедуры, завершившейся с ошибкой.
00050                  */
00051                 const ResT& Value() const
00052                 {
00053                         AsyncProcImplPtr temp = Proc();
00054                         if (!temp) throw IllegalStateException("Cntm::AsyncProcResult::Value()", "Результат асинхронной процедуры неопределен, т.к. хэндлу асинхронной процедуры не присвоено значения");
00055                         return static_cast<SpecUtils::AsyncProcResImpl<ResT>*>(temp.Pointer())->GetResult();
00056                 }
00057 
00058                 /**
00059                  * Оператор приведения к типу возвращаемого асинхронным методом значения. Вызывает метод Value().
00060                  * 
00061                  * Исключение: NoneAsyncResultException - попытка получения результата процедуры, завершившейся с ошибкой. 
00062                  */
00063                 operator const ResT& () const { return Value(); }
00064 
00065                 /**
00066                  * Метод аналогичен методу SetFinishProc. Данный метод принимает объект и метод и формирует отсроченную потоковую процедуру на основе указанных данных. В качестве аргумента указывается данный объект, что позволяет обработчику завершения получить результат выполнения. 
00067                  * 
00068                  * Сигнатура метода Method должна иметь вид: "void(const AsyncProcHandle& res)".
00069                  * 
00070                  * Для удобства использования возвращается этот же объект.
00071                  * 
00072                  * См. Cntm::AsyncProc::SuspendThread.
00073                  * @param Object - объект-обработчик. Задается обычным указателем.
00074                  * @param Method - метод объекта Object, который будет вызван синхронизированно в указанном синхропространстве.
00075                  * @param Priority - приоритет потока, опционально, значение по умолчанию - tpNormal (см. перечисление Cntm::BasicAsyncProc::ThreadPriority).
00076                  * @param HoldRef - хранить ли ссылку на объект Object, если это ссылочный объект. Параметр опциональный, значение по умолчанию - true.
00077                  */
00078                 template < typename ClassT, typename MethodT >
00079                 AsyncProcResult& BindFinishToThreadProc(ClassT Object,
00080                         MethodT Method,
00081                         ThreadPriority Priority = tpNormal,
00082                         bool HoldRef = true);
00083 
00084                 /**
00085                  * Метод аналогичен методу SetFinishProc. Данный метод принимает объект и метод и формирует отсроченную отложенную процедуру на основе указанных данных. В качестве аргумента указывается данный объект, что позволяет обработчику завершения получить результат выполнения.
00086                  * 
00087                  * Сигнатура метода Method должна иметь вид: "void(const AsyncProcHandle& res)".
00088                  * 
00089                  * Для удобства использования возвращается этот же объект.
00090                  * 
00091                  * См. Cntm::AsyncProc::SuspendDefer.
00092                  * @param Object - объект-обработчик. Задается обычным указателем.
00093                  * @param Method - метод объекта Object, который будет вызван синхронизированно в указанном синхропространстве.
00094                  * @param Space - синхропространство, в котором будет выполнен метод. Если явно не указано, тоиспользуется синхропространство объекта Object, если это синхрообъект, иначе используется главное синхропространство.
00095                  * @param HoldRef - хранить ли ссылку на объект Object, если это ссылочный объект. Параметр опциональный, значение по умолчанию - true.
00096                  */
00097                 template < typename ClassT, typename MethodT >
00098                 AsyncProcResult& BindFinishToDeferProc(ClassT Object,
00099                         MethodT Method,
00100                         SynchroSpace::Ptr Space = SynchroSpace::Ptr(),
00101                         bool HoldRef = true);
00102 
00103                 /**
00104                  * Метод аналогичен методу SetFinishProc. Данный метод принимает объект и метод и формирует отсроченную прямую процедуру на основе указанных данных. В качестве аргумента указывается данный объект, что позволяет обработчику завершения получить результат выполнения.
00105                  * 
00106                  * Сигнатура метода Method должна иметь вид: "void(const AsyncProcHandle& res)".
00107                  * 
00108                  * Для удобства использования возвращается этот же объект.
00109                  * 
00110                  * См. Cntm::AsyncProc::SuspendDirect.
00111                  * @param Object - объект-обработчик. Задается обычным указателем.
00112                  * @param Method - метод объекта Object, который будет вызван синхронизированно в указанном синхропространстве.
00113                  * @param HoldRef - хранить ли ссылку на объект Object, если это ссылочный объект. Параметр опциональный, значение по умолчанию - true.
00114                  */
00115                 template < typename ClassT, typename MethodT >
00116                 AsyncProcResult& BindFinishToDirectProc(ClassT Object,
00117                         MethodT Method,
00118                         bool HoldRef = true);
00119 
00120         private:
00121         
00122                 template <typename ResT1> friend class SpecUtils::AsyncProcResImpl;
00123                 
00124                 /**
00125                  * Конструктор инициализации. 
00126                  */
00127                 AsyncProcResult(const RefPtr < SpecUtils::AsyncProcImpl > & Proc): AsyncProcHandle(Proc) {}                     
00128         };
00129 
00130 
00131         /**
00132          * Специальная версия класса результата асинхронной прцедуры, когда возвращаемое значение отсутствует.
00133          * 
00134          * Не содержит методов получения возвращаемого значения.
00135          * 
00136          * Данный класс обеспечивает многопоточность.
00137          * @author Овсеевич Р.
00138          */
00139         template <>
00140         class AsyncProcResult<void>: public AsyncProcHandle
00141         {
00142         public:
00143         
00144                 /**
00145                  * Конструктор по умолчанию. Создает результат, не связанный с асинхронной процедурой. 
00146                  */
00147                 AsyncProcResult(): AsyncProcHandle() {}
00148                 
00149 
00150                 /**
00151                  * Метод аналогичен методу SetFinishProc. Данный метод принимает объект и метод и формирует отсроченную потоковую процедуру на основе указанных данных. В качестве аргумента указывается данный объект, что позволяет обработчику завершения получить результат выполнения. 
00152                  * 
00153                  * Сигнатура метода Method должна иметь вид: "void(const AsyncProcHandle& res)".
00154                  * 
00155                  * Для удобства использования возвращается этот же объект.
00156                  * 
00157                  * См. Cntm::AsyncProc::SuspendThread.
00158                  * @param Object - объект-обработчик. Задается обычным указателем.
00159                  * @param Method - метод объекта Object, который будет вызван синхронизированно в указанном синхропространстве.
00160                  * @param Priority - приоритет потока, опционально, значение по умолчанию - tpNormal (см. перечисление Cntm::BasicAsyncProc::ThreadPriority).
00161                  * @param HoldRef - хранить ли ссылку на объект Object, если это ссылочный объект. Параметр опциональный, значение по умолчанию - true.
00162                  */
00163                 template < typename ClassT, typename MethodT >
00164                 AsyncProcResult& BindFinishToThreadProc(ClassT Object,
00165                         MethodT Method,
00166                         ThreadPriority Priority = tpNormal,
00167                         bool HoldRef = true);
00168 
00169                 /**
00170                  * Метод аналогичен методу SetFinishProc. Данный метод принимает объект и метод и формирует отсроченную отложенную процедуру на основе указанных данных. В качестве аргумента указывается данный объект, что позволяет обработчику завершения получить результат выполнения.
00171                  * 
00172                  * Сигнатура метода Method должна иметь вид: "void(const AsyncProcHandle& res)".
00173                  * 
00174                  * Для удобства использования возвращается этот же объект.
00175                  * 
00176                  * См. Cntm::AsyncProc::SuspendDefer.
00177                  * @param Object - объект-обработчик. Задается обычным указателем.
00178                  * @param Method - метод объекта Object, который будет вызван синхронизированно в указанном синхропространстве.
00179                  * @param Space - синхропространство, в котором будет выполнен метод. Если явно не указано, тоиспользуется синхропространство объекта Object, если это синхрообъект, иначе используется главное синхропространство.
00180                  * @param HoldRef - хранить ли ссылку на объект Object, если это ссылочный объект. Параметр опциональный, значение по умолчанию - true.
00181                  */
00182                 template < typename ClassT, typename MethodT >
00183                 AsyncProcResult& BindFinishToDeferProc(ClassT Object,
00184                         MethodT Method,
00185                         SynchroSpace::Ptr Space = SynchroSpace::Ptr(),
00186                         bool HoldRef = true);
00187 
00188                 /**
00189                  * Метод аналогичен методу SetFinishProc. Данный метод принимает объект и метод и формирует отсроченную прямую процедуру на основе указанных данных. В качестве аргумента указывается данный объект, что позволяет обработчику завершения получить результат выполнения.
00190                  * 
00191                  * Сигнатура метода Method должна иметь вид: "void(const AsyncProcHandle& res)".
00192                  * 
00193                  * Для удобства использования возвращается этот же объект.
00194                  * 
00195                  * См. Cntm::AsyncProc::SuspendDirect.
00196                  * @param Object - объект-обработчик. Задается обычным указателем.
00197                  * @param Method - метод объекта Object, который будет вызван синхронизированно в указанном синхропространстве.
00198                  * @param HoldRef - хранить ли ссылку на объект Object, если это ссылочный объект. Параметр опциональный, значение по умолчанию - true.
00199                  */
00200                 template < typename ClassT, typename MethodT >
00201                 AsyncProcResult& BindFinishToDirectProc(ClassT Object,
00202                         MethodT Method,
00203                         bool HoldRef = true);
00204 
00205         private:
00206         
00207                 template <typename ResT1> friend class SpecUtils::AsyncProcResImpl;
00208                 
00209                 AsyncProcResult(const RefPtr < SpecUtils::AsyncProcImpl > & Proc): AsyncProcHandle(Proc) {}                     
00210         };
00211 
00212 }
00213 
00214 #endif //CNTM_ASYNCPROCRESULTDEF_H

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