Название: Плагины для своего приложения Отправлено: xk от Май 12, 2007, 10:42 Решил сделать поддержку плагинов для своего приложения. Плагины все однотипные, заточенные для обмена данными по сети по различным протоколам и парсинга ответов(один плагин - один протокол).
Сделал всё примерно так: есть CPluginManager, который загружает dll'ки, вызывает в каждой специальную ф-ию, возвращающую указатель на объект плагина: Код:
Эти указатели менеджер заносит в свой 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 |