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_SYNCHROREFHANDLEFN_H 00015 #define CNTM_SYNCHROREFHANDLEFN_H 00016 #include <Cntm/RefUtils/Internal/SynchroRefHandleRefImplementation.h> 00017 #include <Cntm/RefUtils/Internal/BasicRefHandle.h> 00018 #include <Cntm/Synchro/SynchroObject.h> 00019 00020 namespace Cntm 00021 { 00022 00023 /** 00024 * Механизм хэндлов предназначен для автоматизации вызова определенного метода объекта при уничтожении последнего хэндла, связанного с объектом. 00025 * 00026 * Отличием данного класса от SynchroRefHandle является то, что задается не метод, а функция, принимающая ссылочный указатель на класс в качестве параметра. 00027 * 00028 * Данный класс является шаблоном, первым параметром которого является тип объекта, а вторым - указатель на функцию, которую следует вызвать. Функция должна иметь сигнатуру void(RefPtr<T>). При вызове данной функции гарантируется, что переданный указатель никогда не будет содержать NULL значения. 00029 * 00030 * Указанный в шаблоне метод может вызываться многократно. Это происходит, если после уничтожения всех хэндлов, связанных с объектом и вызова указанного метода, вновь будут созданы хэндлы, связанные с объектом. 00031 * 00032 * Отличием данного класса от RefHandleFn является то, что гарантируется синхронизированный отложенный вызов указанного в шаблоне метода. Это приводит к тому, что объект, с которым связан хэндл, может быть только синхрообъектом. 00033 * 00034 * Особенность вызова указанной в шаблоне функции. Если после того, как будет уничтожен последний хэндл, связанный с объектом, но до выполнения функции (она вызывается отложенно) создать новый хэндл, связанный с объектом, внутри синхропространства, к которому принадлежит объект, то гарантируется, что вызов функции будет отменен. 00035 * 00036 * Пример: 00037 * \code 00038 * class Class1: public SynchroRefBase 00039 * { 00040 * private: 00041 * static void AutoClose(RefPtr<Class1> p) {...} 00042 * public: 00043 * typedef RefPtr<Class1> Ptr; 00044 * typedef SynchroRefHandleFn<Class1, &Class1::AutoClose> Handle; 00045 * }; 00046 * 00047 * int main(int argc, char **argv) 00048 * { 00049 * Cntm::QTMainSynchroSpace::Application a(argc, argv); 00050 * 00051 * mw = new Form1(); 00052 * mw->setCaption( "Form1" ); 00053 * mw->show(); 00054 * a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) ); 00055 * 00056 * Class1::Ptr p(new Class1); 00057 * 00058 * if (Какое-то условие) 00059 * { 00060 * Class1::Handle h1 = p; 00061 * Какието-действия с объектом p. 00062 * } // Гарантируется вызов метода Close() для объекта p после уничтожения хэндла, связанного с ним. 00063 * a.exec(); 00064 * } 00065 * \endcode 00066 * 00067 * Класс обеспечивает многопоточность. 00068 * @author Овсеевич Р. 00069 * \ingroup RefUtils 00070 */ 00071 template < typename T, void (*FinalizeP)(RefPtr < T > )> 00072 class SynchroRefHandleFn: public SpecUtils::BasicRefHandle < T, SpecUtils::SynchroRefHandleRefImplementation > 00073 { 00074 public: 00075 00076 /** 00077 * Конструктор по умолчанию. Создает хэндл, не связанный ни с каким объектом. 00078 */ 00079 SynchroRefHandleFn(): 00080 SpecUtils::BasicRefHandle<T, SpecUtils::SynchroRefHandleRefImplementation>(RefPtr<T>::Null(), FinalizeP) 00081 { 00082 CheckTypeCast<SynchroObject*>((T*)NULL); 00083 } 00084 00085 /** 00086 * Конструктор. Создает хэндл, связанный с указанным объектом. 00087 */ 00088 SynchroRefHandleFn(RefPtr<T> Object): 00089 SpecUtils::BasicRefHandle<T, SpecUtils::SynchroRefHandleRefImplementation>(Object, FinalizeP) 00090 { 00091 CheckTypeCast<SynchroObject*>((T*)NULL); 00092 } 00093 00094 /** 00095 * Связывает хэндл с новым объектом. 00096 */ 00097 SynchroRefHandleFn < T, FinalizeP > & operator = (RefPtr<T> Object) 00098 { 00099 Assign(Object); 00100 return *this; 00101 } 00102 00103 /** 00104 * Связывает хэндл с новым объектом. 00105 */ 00106 void Assign(RefPtr<T> Object) 00107 { 00108 SpecUtils::BasicRefHandle<T, SpecUtils::SynchroRefHandleRefImplementation>::Assign(Object, FinalizeP); 00109 } 00110 00111 /** 00112 * Делает хэндл не связанным. 00113 */ 00114 void Unassign() 00115 { 00116 Assign(RefPtr<T>::Null()); 00117 } 00118 00119 private: 00120 00121 /** 00122 * Вызывает указанный метод объекта. 00123 */ 00124 static void Finalize(RefPtr<T> HandledObject) { (HandledObject.Pointer()->*FinalizeP)(); } 00125 }; 00126 00127 } 00128 00129 #endif //CNTM_SYNCHROREFHANDLEFN_H
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |