Класс Cntm::QTMainSynchroSpace
[Cntm.Synchro]

Граф наследования:Cntm::QTMainSynchroSpace:

Cntm::SynchroSpace Cntm::RefBase Cntm::IBasicSynchro Cntm::IRefObject Cntm::IRefObject

Полный список членов класса


Подробное описание

Класс главного синхропространства, использующего средства библиотеки QT для реализации функций главного синхропространства.

Для реализации входа/выхода в синхропространство используется мьютекс (критическая секция) библиотеки QT, которая доступна через методы QApplication::lock(), QApplication::tryLock(), QApplication::unlock().

Обработка отложенных синхрозадач производится в цикле обработки сообщений QT, т.е. в процессе выполнения метода QApplication::exec() или при отображении модального окна. Т.о. система гарантирует, что деинициализация синхрообъектов, обработка отложенных событий и т.д. будет выполняться в главном потоке и, соответственно, синхронизирована со всеми остальными событиями библиотеки QT (например с событиями от кнопок, от таймера и т.д.). Замечание: очереди синхрозадач и событий QT - 2 разные очереди, поэтому порядок выполнения отложенных задач и событий QT может нарушаться: задача может быть обработана раньше, чем событие QT, хотя поставлена была позже и наоборот.

С точки зрения режима входа в главное синхропространство QT все события библиотеки выполняются внутри синхропространства в реентерабельном режиме. Это означает, что из обработчиков событий QT, как и из обработчиков отложенных событий можно производить отображение модальных окон.

Реентерабельный вход в главное синхропространство QT происходит, когда вызывается метод QApplication::exec() или другие методы, приводящие к входу в цикл обработки событий. При попытке реентерабельного входа не из главного потока будет выдано исключение LoopInNoMainThreadException, т.к. библиотека QT запрещает запускать циклы не из главного потока. Если режим входа нереентерабельный, то будет выдано исключение NoReentrantModeException (т.е. в нереентерабельном режиме отображение модальных окон запрещено). Если обработка исключений не поддерживается библиотекой QT, то в этом случае в стандартный поток ошибок будут выданы соответствующие сообщения и программа аварийно завершит работу.

Обеспечение жизненного цикла приложения. Для обеспечения жизненного цикла применяется метод QApplication::exec(). В общем случае жизненный цикл выглядит следующим образом.

 int main(args...)
 {
        Cntm::QTMainSynchroSpace::Prepare();
        QApplication a(args...);
        Cntm::QTMainSynchroSpace::Begin();
        ...
        Инициализация
        ...
        a.exec();
        ...
        Деинициализация
        ...
        Cntm::QTMainSynchroSpace::End();
        return 0;
 }

Верхние три строчки функции main производят создание приложения и подготовку главного синхропространства QT. Далее следует инициализация системы, после чего запускается приложение - это и является жизненным циклом приложения. После завершения работы (например, закрылось главное окно) происходит деинициализация и выход из главного синхропространства - метод End(). Данный метод производит ожидание момента, когда будут уничтожены все синхрообъекты в системе. Для ожидания он использует метод QApplication::exec(). это означает, что во время ожидания цикл обработки сообщений не нарушается. Замечание. В интервале от метода Begin() до входа в цикл обработки событий (a.exec()), от выхода из цикла до входа в следующий цикл, от выхода из цикла до метода End() поток выполнения находится внутри синхропространства в реентерабельном режиме.

Существует более простая и удобная структура приложения:

 int main(args...)
 {
        Cntm::QTMainSynchroSpace::Application a(args...);
        ...
        Инициализация
        ...
        a.exec();
        ...
        Деинициализация
        ...
        return 0;
 }

Если в приложении требуется использовать специальный класс цикла обработки событий, то его следует унаследовать от QTMainSynchroSpace::EventLoop и создать объект цикла до вызова Prepare() или создания объекта QTMainSynchroSpace::Application.

Для более подробной информации см. докементацию по QT (разделы по QApplication и поддержке потоков в QT). От библиотеки QT требуется поддержка многопоточности, поэтому при компиляции следует определить макрос QT_THREAD_SUPPORT в настройках компилятора. При линковке следует использовать библиотеку QT с поддержкой многопоточности.

Для того, что бы использовать QTMainSynchroSpace при компиляции должен быть определен макрос CNTM_USE_QT_SS в настройках компилятора.

Автор:
Овсеевич Р.

См. определение в файле QTMainSynchroSpace.h строка 86


Открытые типы

typedef RefPtr
< QTMainSynchroSpace
Ptr

Открытые члены

void AddSynchroTask (TaskBase *Task)
 Добавить новую задачу в конец очереди.

Открытые статические члены

static void Prepare ()
 Подготовка главного синхропространства.
static void Begin ()
 Вход в главное синхропространство (режим входа реентерабельный).
static void End ()
 Выход из главного синхропространства.

Защищенные члены

 ~QTMainSynchroSpace ()
 Деструктор.
void DoEnter ()
 Выполнить вход в критическую секцию, связанную с синхропространством.
bool DoTryEnter ()
 Выполнить вход в критическую секцию, связанную с синхропространством.
void DoLeave ()
 Выполнить вход в критическую секцию, связанную с синхропространством.

Друзья

class Implement

Классы

class  Application
 Класс QT приложения. Подробнее...
class  EventLoop
 Специальный класс цикла обработки событий QT. Подробнее...
class  Implement
 Класс, реализующий все функции синхропространства (вход в синхропространство, выполнение синхронных задач), созданием объекта синхропространства и ожидания его уничтожения.
class  PrepareLauncher
 Класс, обеспечивающий вызов метода Cntm::QTMainsynchroSpace::Prepare() перед созданием объекта класса QApplication.

Определения типов

typedef RefPtr<QTMainSynchroSpace> Cntm::QTMainSynchroSpace::Ptr

Переопределяет метод предка Cntm::SynchroSpace.

См. определение в файле QTMainSynchroSpace.h строка 106


Конструктор(ы)

Cntm::QTMainSynchroSpace::~QTMainSynchroSpace (  )  [inline, protected]

Деструктор.

См. определение в файле QTMainSynchroSpace.h строка 236


Методы

void Cntm::QTMainSynchroSpace::AddSynchroTask ( TaskBase *  Task  )  [inline]

Добавить новую задачу в конец очереди.

Объект задачи д.б. создан в динамической памяти. После выполнения задача автоматически будет удалена. Класс объекта задачи д.б. унаследован от SynchroSpace::TaskBase.

Подробнее о синхрозадачах см. описание класса SynchroSpace и SynchroSpace::TaskBase.

Система гарантирует, что задача будет выполнена в контексте главного потока синхронно с прочими событиями библиотеки QT.

Исключения:
NullArgException если не указана задача.
Аргументы:
Task - задача, которую нужно выполнить. Объект задачи д.б. создан в динамической памяти.

См. определение в файле QTMainSynchroSpace.h строка 206

void Cntm::QTMainSynchroSpace::Prepare (  )  [static]

Подготовка главного синхропространства.

Должен вызываться до создания объекта QApplication. Если используется специальный цикл обработки событий (унаследованный от QTMainSynchroSpace::EventLoop), то он должен быть создан до вызова данного метода.

Вместо вызова этого метода рекомендуется использовать класс QTMainSynchroSpace::Application.

Исключения:
IllegalStateException при попытке повторного создания главного синхропространства (главное синхропространство этого же или другого типа уже создано).

См. определение в файле QTMainSynchroSpace.cpp строка 142

Перекрестные ссылки Cntm::QTMainSynchroSpace::EventLoop::CreateEventLoop() и Implement.

static void Cntm::QTMainSynchroSpace::Begin (  )  [inline, static]

Вход в главное синхропространство (режим входа реентерабельный).

Должен вызываться после создания объекта QApplication.

Вместо вызова этого метода рекомендуется использовать класс QTMainSynchroSpace::Application.

См. определение в файле QTMainSynchroSpace.h строка 222

static void Cntm::QTMainSynchroSpace::End (  )  [inline, static]

Выход из главного синхропространства.

Метод производит ожидание уничтожения всех синхрообъектов и синхропространств. В процессе ожидания запускается цикл обработки событий.

См. определение в файле QTMainSynchroSpace.h строка 227

void Cntm::QTMainSynchroSpace::DoEnter (  )  [inline, protected, virtual]

Выполнить вход в критическую секцию, связанную с синхропространством.

Вызывает QApplication::lock().

Замещает Cntm::SynchroSpace.

См. определение в файле QTMainSynchroSpace.h строка 241

bool Cntm::QTMainSynchroSpace::DoTryEnter (  )  [inline, protected, virtual]

Выполнить вход в критическую секцию, связанную с синхропространством.

Вызывает QApplication::tryLock().

Замещает Cntm::SynchroSpace.

См. определение в файле QTMainSynchroSpace.h строка 246

void Cntm::QTMainSynchroSpace::DoLeave (  )  [inline, protected, virtual]

Выполнить вход в критическую секцию, связанную с синхропространством.

Вызывает QApplication::unlock().

Замещает Cntm::SynchroSpace.

См. определение в файле QTMainSynchroSpace.h строка 251


Документация по друзьям класса и функциям, отноносящимся к классу

friend class Implement [friend]

См. определение в файле QTMainSynchroSpace.h строка 231


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