Russian Qt Forum

Qt => Общие вопросы => Тема начата: Blackwanderer от Сентябрь 03, 2010, 15:14



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


Название: Re: Общие данные для программы и плагина. Как сделать?
Отправлено: DenKor от Сентябрь 03, 2010, 15:21
Есть класс QSharedMemory


Название: Re: Общие данные для программы и плагина. Как l
Отправлено: Blackwanderer от Сентябрь 03, 2010, 15:45
Цитировать
Есть класс QSharedMemory
Не совсем то, что нужно. В первую очередь меня интересует независимость и изящность доступа к данным. Использование QSharedMemory, подразумевает первоначальную передачу всех объектов QSharedMemory в плагин (и таких объектов будет с два десятка), а это уже не красиво. Плагин (класс основной программы) в идеале должен сам по себе знать, где ему получить доступ к данным. В крайнем случае плагину (классу основной программы) должен передаваться один параметр через который плагин (класс основной программы) может получать доступ ко всем данным.


Название: Re: Общие данные для программы и плагина. Как l
Отправлено: Denjs от Сентябрь 03, 2010, 16:03
Плагин (класс основной программы) в идеале должен сам по себе знать, где ему получить доступ к данным. В крайнем случае плагину (классу основной программы) должен передаваться один параметр через который плагин (класс основной программы) может получать доступ ко всем данным.
поподробней пожалуйста)
а как вы передавали бы данные, если бы у вас был не плагин а классы внутри программы?
что мешает передавать список состоящий из 20 указателей на ваши объекты?

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

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

но не понимаю вашей заморочки...


Название: Re: Общие данные для программы и плагина. Как сделать?
Отправлено: Blackwanderer от Сентябрь 03, 2010, 16:33
Цитировать
а как вы передавали бы данные, если бы у вас был не плагин а классы внутри программы?
В пределах одной программы я бы использовал класс со статическими данными.
Но в масштабах нескольких проектов это, на мой взгляд, снижает читабельность и понятность программы.

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

Цитировать
но не понимаю вашей заморочки...
Заморочка чисто эстетическая. Код и без всего этого уже нормально работает, но он некрасивый :)


Название: Re: Общие данные для программы и плагина. Как l
Отправлено: DenKor от Сентябрь 04, 2010, 17:42
Цитировать
Есть класс QSharedMemory
Не совсем то, что нужно. В первую очередь меня интересует независимость и изящность доступа к данным. Использование QSharedMemory, подразумевает первоначальную передачу всех объектов QSharedMemory в плагин (и таких объектов будет с два десятка), а это уже не красиво. Плагин (класс основной программы) в идеале должен сам по себе знать, где ему получить доступ к данным. В крайнем случае плагину (классу основной программы) должен передаваться один параметр через который плагин (класс основной программы) может получать доступ ко всем данным.

Прежде чем писать плагины необходимо написать API для обмена информацией в обе стороны. Тогда у вас программа и плагины будут знать как получить необходимые им данные.  Это будет эстетически правильно и позволит сохранить независимость программы от плагинов.
Используйте сишные структуры, а  не классы в качестве параметров при вызове функций. Это позволит писать плагины не только под qt. Иначе пишите плагины с использованием классов модуля QtScript


Название: Re: Общие данные для программы и плагина. Как l
Отправлено: Blackwanderer от Сентябрь 05, 2010, 07:16
Прежде чем писать плагины необходимо написать API для обмена информацией в обе стороны. Тогда у вас программа и плагины будут знать как получить необходимые им данные.  Это будет эстетически правильно и позволит сохранить независимость программы от плагинов.
А можно небольшой пример? Если бы знал, как это сделать, давно бы уже сделал.


Название: Re: Общие данные для программы и плагина. Как сделать?
Отправлено: SASA от Сентябрь 05, 2010, 14:06
В пределах одной программы я бы использовал класс со статическими данными.
Но в масштабах нескольких проектов это, на мой взгляд, снижает читабельность и понятность программы.
Так вынисите это класс в отдельную длл. DataManager.dll


Название: Re: Общие данные для программы и плагина. Как l
Отправлено: Igors от Сентябрь 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
};