Решил сделать поддержку плагинов для своего приложения. Плагины все однотипные, заточенные для обмена данными по сети по различным протоколам и парсинга ответов(один плагин - один протокол).
Сделал всё примерно так: есть 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 серверов по одному протоколу, тогда эти сервера будут опрашиваться по-очереди и теряется весь смысл многопоточности.