Для реализации входа/выхода в синхропространство используется мьютекс (критическая секция) библиотеки 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. |
Переопределяет метод предка Cntm::SynchroSpace.
См. определение в файле QTMainSynchroSpace.h строка 106
Cntm::QTMainSynchroSpace::~QTMainSynchroSpace | ( | ) | [inline, protected] |
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
© Овсеевич Р.В. Документация по CntmLib 1.1.4 от 28 May 2008. Создано системой 1.5.3 |