我有一个Qt5应用程序,它使用QNetworkAccessManager
进行网络请求,可通过单例和QPluginLoader
访问,以加载向程序添加功能的扩展。目前我正在使用插件的静态链接,一切正常。
但是,我想切换到使用动态库将核心功能与应用程序的其他部分分开。我通过宏添加了必要的declspec
,并在我的.pro文件中进行了必要的调整。
问题是,当从dll使用时,经常(例如,4次启动中的3次)QNetworkAccessManager
只返回空请求或空指针。没有数据,没有错误字符串,没有标题。
这是我用来加载插件的代码:
template <typename PluginType>
static QList<PluginType*> loadModules() {
QList<PluginType*> loadedModules;
foreach (QObject* instance, QPluginLoader::staticInstances()) {
PluginType* plugin = qobject_cast<PluginType*>(instance);
if (plugin) {
loadedModules << plugin;
}
}
QDir modulesDir(qApp->applicationDirPath() + "/modules");
foreach (QString fileName, modulesDir.entryList(QDir::Files)) {
QPluginLoader loader(modulesDir.absoluteFilePath(fileName));
QObject *instance = loader.instance();
PluginType* plugin = qobject_cast<PluginType*>(instance);
if (plugin) {
loadedModules << plugin;
}
}
return loadedModules;
}
在启动期间调用的非静态非模板重载中使用了哪个:
bool AppController::loadModules() {
m_window = new AppWindow();
/* some unimportant connection and splashscreen updating */
QList <ModuleInterface*> loadedModules = loadModules<ModuleInterface>();
foreach (ModuleInterface* module, loadedModules) {
m_splash->showMessage(tr("Initializing module: %1").arg(module->getModuleName()),
Qt::AlignBottom | Qt::AlignRight, Qt::white);
module->preinit();
QApplication::processEvents();
// [1]
ControllerInterface *controller = module->getMainController();
m_window->addModule(module->getModuleName(),
QIcon(module->getIconPath()),
controller->primaryWidget(),
controller->settingsWidget());
m_moduleControllers << controller;
}
m_window->addGeneralSettings((new GeneralSettingsController(m_window))->settingsWidget());
m_window->enableSettings();
/* restoring window geometry & showing it */
return true;
}
但是,如果我将QThread::sleep(1);
插入标记为 1 的行中,它可以正常工作,但加载速度会变慢,我非常怀疑它是一个可以在任何地方使用的稳定解决方案。
此外,我发送请求的网站是MyAnimeList。
答案 0 :(得分:0)
好的,现在我终于调试了它。原来我在其中一个需要非同步访问的类中删除了内部QNetworkAccessManager。那,并更新到Qt5.3似乎解决了我的问题。