ExtraSynchroSpace.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_EXTRASYNCHROSPACE_H
00015 #define CNTM_EXTRASYNCHROSPACE_H
00016 #include <Cntm/Synchro/SynchroSpace.h>
00017 #include <Cntm/SystemUtils/SysCriticalSection.h>
00018 #include <Cntm/SystemUtils/SysThread.h>
00019 
00020 namespace Cntm
00021 {
00022 
00023         /**
00024          * Класс дополнительного синхропространства. Описание понятия синхропространства приведено в SynchroSpace.
00025          * 
00026          * Для обработки синхронных задач используются потоки выполнения, отличные от главного потока.
00027          * 
00028          * Замечание по реентерабельности. Поскольку реентерабельный вход в данный тип синхропространства невозможен (т.к. отстутствует команда на немедленный запуск выполнения синхронных заданий), то разница между реентерабельным и не реентерабельным режимами отсутствует.
00029          * @author Овсеевич Р. 
00030          * \ingroup Synchro
00031          */
00032         class ExtraSynchroSpace: public SynchroSpace
00033         {
00034         public:
00035         
00036                 typedef RefPtr<ExtraSynchroSpace> Ptr;
00037 
00038                 /**
00039                  * Конструктор по умолчанию.
00040                  */
00041                 ExtraSynchroSpace(): SynchroSpace(), mainSpace(Main()) {}
00042                 
00043                 /**
00044                  * Добавить новую задачу в конец очереди. Объект задачи д.б. создан в динамической памяти. После выполнения задача автоматически будет удалена. Класс объекта задачи д.б. унаследован от Cntm:: SynchroSpace:: TaskBase.
00045                  * 
00046                  * Подробнее о синхрозадачах см. описание класса SynchroSpace и SynchroSpace::TaskBase.
00047                  * 
00048                  * Система гарантирует, что задача будет выполнена в контексте главного потока синхронно с прочими событиями библиотеки QT.
00049                  * 
00050                  * \throw NullArgException если не указана задача.
00051                  */
00052                 void AddSynchroTask(TaskBase* Task);
00053         
00054         protected:
00055 
00056                 /**
00057                  * Выполнить вход в критическую секцию, связанную с синхропространством. Вызывает QApplication::lock(). 
00058                  */
00059                 void DoEnter() { critSection.Enter(); }
00060 
00061                 /**
00062                  * Выполнить вход в критическую секцию, связанную с синхропространством. Вызывает QApplication::tryLock().
00063                  */
00064                 bool DoTryEnter() { return critSection.TryEnter(); }
00065 
00066                 /**
00067                  * Выполнить вход в критическую секцию, связанную с синхропространством. Вызывает QApplication::unlock().
00068                  */
00069                 void DoLeave() { critSection.Leave(); }
00070         
00071         private:
00072 
00073                 /**
00074                  * Критическая секция данного синхропространства.
00075                  */
00076                 SpecUtils::SysCriticalSection critSection;
00077                 
00078                 /**
00079                  * Указатель на себя, чтобы хранить ссылку на время работы потока, который обрабатывает синхронные задачи.
00080                  */
00081                 Ptr holdInstance;
00082                 
00083                 /**
00084                  * Очередь синхронных задач.
00085                  */
00086                 TaskQueue taskQueue;
00087 
00088                 /**
00089                  * Ссылка на главное синхропространство. Хранится, что бы главное синхропространство умерло последним, что гарантирует незавершение программы, пока хотя бы одно дополнитнльное синхропространство живо.
00090                  */
00091                 SynchroSpace::Ptr mainSpace;
00092                 
00093                 /**
00094                  * Поток обработки задач.
00095                  */
00096                 static SpecUtils::SysThread::ResultType CNTM_SYSTHREAD_PROC_DECL TaskThread(void* Arg);
00097         };
00098 
00099 }
00100 
00101 #endif //CNTM_EXTRASYNCHROSPACE_H

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