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