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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Плагины для своего приложения  (Прочитано 2713 раз)
xk
Гость
« : Май 12, 2007, 10:42 »

Решил сделать поддержку плагинов для своего приложения. Плагины все однотипные, заточенные для обмена данными по сети по различным протоколам и парсинга ответов(один плагин - один протокол).

Сделал всё примерно так: есть CPluginManager, который загружает  dll'ки, вызывает в каждой специальную ф-ию, возвращающую указатель на объект плагина:
Код:

extern "C" PLUGINEXPORT CAbstractPlugin* createPlugin(void) throw()
{
  return new CSomePlugin;
}

Эти указатели менеджер заносит в свой QList<CAbstractPlugin*> pluginList;

Все плагины соответственно наследуются от абстрактного класса CAbstractPlugin.


Всё это отлично работало, когда надо было опрашивать немного серверов по-очереди (отрабатывали разные плагины по-очереди). Теперь понадобился параллельный опрос нескольких серваков - я использую QThread, который запрашивает в своём методе run() нужный плугин у CPluginManager- тот возвращает указатель и thread вызывает нужные методы по этому указателю.

Вот тут-то и начались проблемы :wink: . Дело всё в том, что два треда могут одновременно опрашивать два сервака и использовать при этом один и тот же плугин, т.е. указатель на один и тот же объект, что плохо  Улыбающийся, т.к. объект этот не реентерабельный (и сделать его таковым нет возможности).

Я думаю надо как-то в QThread::run() получать копию нужного объекта для каждого треда - пуской каждый тред работает со своей копией, но как это сделать ? ведь CAbstractPlugin - абстрактный класс, который нельзя интсанцировать.

Помогите советом, плз. Вопрос наверно больше на С++ и архитектуру, нежели на Qt  Улыбающийся

ЗЫ: поставить мьютекс на каждый плагин - не подходит, потому что вполне возможно, что юзер захочет опросить 10 серверов по одному протоколу, тогда эти сервера будут опрашиваться по-очереди и теряется весь смысл многопоточности.
Записан
AlexVR
Гость
« Ответ #1 : Май 12, 2007, 12:18 »

А кто тебе мешает создать хеш ("Тип Протокола", createPlugin для него) вместо pluginList и создавать объект для каждого соединения используя его.
Записан
xk
Гость
« Ответ #2 : Май 12, 2007, 12:33 »

Спасибо!
как я сам не догадался Веселый
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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