Russian Qt Forum

Qt => Общие вопросы => Тема начата: xk от Май 12, 2007, 10:42



Название: Плагины для своего приложения
Отправлено: 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 от Май 12, 2007, 12:18
А кто тебе мешает создать хеш ("Тип Протокола", createPlugin для него) вместо pluginList и создавать объект для каждого соединения используя его.


Название: Плагины для своего приложения
Отправлено: xk от Май 12, 2007, 12:33
Спасибо!
как я сам не догадался :D