在dll上使用QNetworkAccessManager

时间:2014-05-05 16:24:45

标签: qt qt5 qtnetwork

我有一个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

1 个答案:

答案 0 :(得分:0)

好的,现在我终于调试了它。原来我在其中一个需要非同步访问的类中删除了内部QNetworkAccessManager。那,并更新到Qt5.3似乎解决了我的问题。