Russian Qt Forum
Ноябрь 26, 2024, 05:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Глобальная система событий (обмен сигналами между ветками)  (Прочитано 9639 раз)
Ginger_Ministrel
Гость
« : Июль 17, 2014, 16:09 »

Суть такова: у нас есть программа, с большим ветвистым деревом объектов, создающих друг друга. Необходимо связать функции, находящиеся достаточно глубоко в разных ветках.

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

Ни одна из этих трех идей мне не нравится. Интересно узнать, как в таких случаях поступают суровые парни :33
« Последнее редактирование: Июль 17, 2014, 16:19 от Ginger_Ministrel » Записан
Bepec
Гость
« Ответ #1 : Июль 17, 2014, 18:01 »

В чем проблема сделать сигнал в каждой ветке? А при создании просто цеплять к основе?
Каскадно получится Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Июль 17, 2014, 19:18 »

На данный момент я вижу три варианта: либо делать все публичным и коннектить через десять стрелочек, либо каскадно сливать сигналы, заводя по сигналу в каждом объекте, который ближе к корню чем нужные, либо делать глобальный объект, который будет принимать и раздавать сигналы.
Давайте по рассуждаем.
Не важно, в какой структуре хранятся эти объекты. Сигналы-слоты связывают два объекта, значит нам нужны средства нахождения подходящих объектов для связывания. Само связывание можно делать в отдельной сущности (объекте), которая(ый) будет знать (уметь находить) нужные два объекта для связывания.
Записан
_OLEGator_
Гость
« Ответ #3 : Июль 17, 2014, 22:41 »

Да, я бы делал через отдельный объект/менеджер.
Кстати, может пригодится, делал похожий механизм, но сейчас эту библиотеку не использую т.к. основная разработка не на Qt:
http://www.prog.org.ru/topic_24458_0.html

Там есть класс CXEventMachine, с помощью которого можно подписаться на произвольное событие (используется механизм сигналов/слотов). Событие испускается также с помощью этого класса и раздается всем подписанным.
Записан
Ginger_Ministrel
Гость
« Ответ #4 : Июль 18, 2014, 11:35 »

Верес, технически проблемы в этом нет, но меня смущает нахождение в практически каждом классе сигналов, сделанных только для того, чтобы передавать другие сигналы ниже. В итоге в практически коренных классах будет тонна сигналов, по сути самому классу не нужных.

Old, собственно, к такому варианту я и склоняюсь. Вопрос в том, как его сделать и где создавать, чтобы все-все-все его видели. Синглтон со статическими функциями?

_OLEGator_, спасибо, сейчас гляну, что там.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Июль 18, 2014, 11:39 »

Вопрос в том, как его сделать и где создавать, чтобы все-все-все его видели.
Для этого и нужны критерии, по которым вы принимаете решение связывать объекты. Опишите их подробней

Синглтон со статическими функциями?
Не надо эту гадость лишний раз тянуть в проект.
Записан
Ginger_Ministrel
Гость
« Ответ #6 : Июль 18, 2014, 11:52 »

Например: в самом первом классе живет графический экран (QGraphicsView) и модули. В каждом модуле живет движок, в котором, в свою очередь, живет неопределенное количество графических сцен (QGraphicsScene). Нужно иметь возможность устанавливать экрану, какую сцену он отображает, причем запрос может поступить как от движка, так и от сцены или даже от объекта на сцене.

Алсо, совершенно нет уверенности, что дерево не разрастется шире. Более того, скорее всего так и будет. Поэтому не хочется делать каскадную передачу, чтобы потом ее везде весело править.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Июль 18, 2014, 11:55 »

Например: в самом первом классе живет графический экран (QGraphicsView) и модули. В каждом модуле живет движок, в котором, в свою очередь, живет неопределенное количество графических сцен (QGraphicsScene). Нужно иметь возможность устанавливать экрану, какую сцену он отображает, причем запрос может поступить как от движка, так и от сцены или даже от объекта на сцене.
А я бы тут подумал про событийную систему с широковещательными сообщениями: получат сообщение все, кому надо - отреагирует.
Записан
Ginger_Ministrel
Гость
« Ответ #8 : Июль 18, 2014, 12:20 »

А как это лучше реализовать технически? Попробовал покурить QEvent, но то ли не докурил, то ли оно для этого не особо подходит.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Июль 18, 2014, 12:31 »

А как это лучше реализовать технически? Попробовал покурить QEvent, но то ли не докурил, то ли оно для этого не особо подходит.
В самом примитивном случае вам нужно пробежаться по всем объектам и вызвать метод, например, eventHandle. Соответственно, у каждого объекта она должна быть, для этого проще всего сделать специальный класс и подмешать его для базового (базовых) классов всех возможных объектов.

Код
C++ (Qt)
enum EventType { Event1, Event2, ... }
 
class EventHandler
{
public:
   virtual void eventHandle( EventType event, void *param = 0 ) = 0;
};
 
 
class BaseObject : public QObject, public EventHandler
{
public:
   ...
   virtual void eventHandle( EventType event, void *param = 0 );
};
 

А дальше можно навертеть много всего. Улыбающийся
Например, можно сделать, что бы при конструировании рабочих объектов, они сами регистрировались в списке на оповещение, а при разрушении - выписывались. Ну и т.д.
Записан
Bepec
Гость
« Ответ #10 : Июль 18, 2014, 12:47 »

А разве это не имитация сигнал слотовой системы Qt? Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Июль 18, 2014, 12:51 »

А разве это не имитация сигнал слотовой системы Qt? Улыбающийся
А в каком месте она имитируется?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #12 : Июль 18, 2014, 12:52 »

нет: в данном случае необязательно указывать источник сигнала.

кстати в Mac OS X есть такой механизм из коробки (NSNotificationCenter) Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #13 : Июль 18, 2014, 13:00 »

Ошибся, точнее системы QEvent Улыбающийся
Записан
Ginger_Ministrel
Гость
« Ответ #14 : Июль 18, 2014, 13:03 »

нет: в данном случае необязательно указывать источник сигнала.
В идеале хотелось бы сделать так, чтобы не нужно было и приемник сигнала указывать. Чтобы можно было не завязываться на то, какая там вообще в программе структура - просто если кто-то издает такой-то сигнал, то все, кому этого надо, начинают по нему выполнять действия.

В самом примитивном случае вам нужно пробежаться по всем объектам и вызвать метод, например, eventHandle. Соответственно, у каждого объекта она должна быть, для этого проще всего сделать специальный класс и подмешать его для базового (базовых) классов всех возможных объектов.
Насчет специального класса идею понял. А как это все обходить? По-любому понадобится какая-то глобальная штука, которая будет из конструкторов передавать в какой-то глобальный объект список всех объектов, а потом по сингналу тыкать.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.11 секунд. Запросов: 23.