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
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |