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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Общие данные для программы и плагина. Как сделать?  (Прочитано 4654 раз)
Blackwanderer
Гость
« : Сентябрь 03, 2010, 15:14 »

Доброго времени суток!
Пишу приложения для матмоделирования физических процессов. Есть основная программа, которая выполняет операции, независимые от конкретной физической задачи. Есть плагины, которые выполняют операции зависящие от конкретной задачи. Хочется как-нибудь организовать программе и плагинам совместный независимый доступ к некоторым данным. Пока что единственный вариант, пришедший на ум - создание статического класса, хранящего эти данные. Но чем-то мне этот вариант не нравится (просто эстетически, можно считать это капризом), поэтому решил обратиться за советом к сообществу. Буду благодарен за обсуждение, советы и предложения по решению поставленной задачи.
Записан
DenKor
Гость
« Ответ #1 : Сентябрь 03, 2010, 15:21 »

Есть класс QSharedMemory
Записан
Blackwanderer
Гость
« Ответ #2 : Сентябрь 03, 2010, 15:45 »

Цитировать
Есть класс QSharedMemory
Не совсем то, что нужно. В первую очередь меня интересует независимость и изящность доступа к данным. Использование QSharedMemory, подразумевает первоначальную передачу всех объектов QSharedMemory в плагин (и таких объектов будет с два десятка), а это уже не красиво. Плагин (класс основной программы) в идеале должен сам по себе знать, где ему получить доступ к данным. В крайнем случае плагину (классу основной программы) должен передаваться один параметр через который плагин (класс основной программы) может получать доступ ко всем данным.
Записан
Denjs
Гость
« Ответ #3 : Сентябрь 03, 2010, 16:03 »

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

организуйте некоторое хранилице-реестр,.. или хранилище выдающее по имени ссылку на нужный объект...

как извращенный вариант - можно завязаться на использование мета-объектной системы QT. Скажем все классы что вы хотите предать пучком - организуйте в подчинение одному объекту. и ищите их по связям родитель-подчиненный. Или именуйте их специфически (QObject::setObjectName) - и ищите в системе по имени - тогда программа действительно будет "сама знать где ей найти нужные параметры"..

но не понимаю вашей заморочки...
Записан
Blackwanderer
Гость
« Ответ #4 : Сентябрь 03, 2010, 16:33 »

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

Цитировать
что мешает передавать список состоящий из 20 указателей на ваши объекты?
А вот об этом я не подумал. Вполне можно сделать.

Цитировать
но не понимаю вашей заморочки...
Заморочка чисто эстетическая. Код и без всего этого уже нормально работает, но он некрасивый Улыбающийся
Записан
DenKor
Гость
« Ответ #5 : Сентябрь 04, 2010, 17:42 »

Цитировать
Есть класс QSharedMemory
Не совсем то, что нужно. В первую очередь меня интересует независимость и изящность доступа к данным. Использование QSharedMemory, подразумевает первоначальную передачу всех объектов QSharedMemory в плагин (и таких объектов будет с два десятка), а это уже не красиво. Плагин (класс основной программы) в идеале должен сам по себе знать, где ему получить доступ к данным. В крайнем случае плагину (классу основной программы) должен передаваться один параметр через который плагин (класс основной программы) может получать доступ ко всем данным.

Прежде чем писать плагины необходимо написать API для обмена информацией в обе стороны. Тогда у вас программа и плагины будут знать как получить необходимые им данные.  Это будет эстетически правильно и позволит сохранить независимость программы от плагинов.
Используйте сишные структуры, а  не классы в качестве параметров при вызове функций. Это позволит писать плагины не только под qt. Иначе пишите плагины с использованием классов модуля QtScript
Записан
Blackwanderer
Гость
« Ответ #6 : Сентябрь 05, 2010, 07:16 »

Прежде чем писать плагины необходимо написать API для обмена информацией в обе стороны. Тогда у вас программа и плагины будут знать как получить необходимые им данные.  Это будет эстетически правильно и позволит сохранить независимость программы от плагинов.
А можно небольшой пример? Если бы знал, как это сделать, давно бы уже сделал.
Записан
SASA
Гость
« Ответ #7 : Сентябрь 05, 2010, 14:06 »

В пределах одной программы я бы использовал класс со статическими данными.
Но в масштабах нескольких проектов это, на мой взгляд, снижает читабельность и понятность программы.
Так вынисите это класс в отдельную длл. DataManager.dll
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Сентябрь 05, 2010, 18:55 »

А можно небольшой пример? Если бы знал, как это сделать, давно бы уже сделал.
Не вопрос. Псевдокод ф-ции плагинв
Код
C++ (Qt)
EXPORT SInt32 HostCallsPlug( THostData * theHostData );
 
struct THostData {
 UInt32 mHostID;                  // unique ID of the host
 UInt32 mHostCommand;       // the host's command (request) ID
 UInt32 mHostDataSize;        // size of data following to validate
 void *  mHostData;              // pointer to context-dependent host's data
};
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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