Сделать это средствами обычных диспетчеров SObjectizer не представляется возможным, т.к. обработчики событий агентов вызываются на контекстах рабочих нитей диспетчера. А методы объекта-окна желательно вызывать на контексте главной нити приложения (либо нити, на которой осуществляется выборка и диспетчеризация оконных сообщений).
Диспетчер so_4::disp::qt_ui предназначен для того, чтобы объекты-окна можно было делать агентами. Вызов обработчиков событий этих агентов будет осуществляться на контексте главной нити. Что позволит агентам-окнам свободно обращаться к GUI примитивам не опасаясь проблем, которые возникают в этих случаях в многопоточных приложениях.
Диспетчер so_4::disp::qt_ui нуждается в дополнительном диспетчере, который будет использоваться для диспетчеризации событий обычных агентов, а так же обслуживанием отложенных и переодических сообщений.
Диспетчер so_4::disp::qt_ui использует механизм обработки событий Qt (основанный на методах postEvent и QObject::event()). При своем старте so_4::disp::qt_ui создает специальный Qt-объект типа so_4::disp::qt_ui::qt_event_processor_t. Этот объект в своем методе event() обрабатывает все Qt-события, которые имеют специальный идентификатор. Отсылает эти события сам диспетчер.
При диспетчерезации события диспетчер so_4::disp::qt_ui определяет, является ли агент-владелец события агентом главной нити. Если нет, то событие диспетчеризируется дополнительным диспетчером. Если же событие относится к агенту главной нити, то событие помещается в отдельную очередь заявок, а объекту qt_event_processor отсылается специальное событие. Объект qt_event_processor благодоря механизмам Qt получает это событие на контексте главной нити. Получив очередное событие qt_event_processor извлекает из отдельной очереди заявок заявку и запускает ее обработчик. Т.о. GUI агент обрабатывает свои события только на контексте главной нити.
Вызов so_4::api::start() нужно осуществлять на контексте любой нити, отличной от главной нити приложения, т.к. возврат из so_4::api::start() осуществляется только при завершении работы run-time SObjectizer. Поэтому, если вызвать so_4::api::start() на контексте главной нити, то приложение остановится в месте вызова so_4::api::start().
required_prj 'so_4/disp/qt_ui/prj.rb'
Документация по SObjectizer v.4.4 'Тебуломста'. Последние изменения: Thu Sep 18 10:26:48 2008. Создано системой 1.5.6 |