1

QNetworkAccessManagerシングルトンを介してアクセスできるネットワーク要求を使用QPluginLoaderし、プログラムに機能を追加する拡張機能をロードする Qt5 アプリケーションがあります。現在、プラグインに静的リンクを使用していますが、すべて正常に動作します

ただし、動的ライブラリの使用に切り替えて、コア機能をアプリの他の部分から分離したいと考えています。必要な をマクロで追加declspecし、.pro ファイルに必要な調整を加えました。

問題は、dll から使用すると、非常に頻繁に (4 回中 3 回の開始など) QNetworkAccessManager、空の要求または null ポインターが返されることです。データなし、エラー文字列なし、ヘッダーなし。

これは、プラグインをロードするために使用しているコードです。

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;
}

ただし、1QThread::sleep(1);とマークされた行に挿入すると、問題なく動作しますが、読み込みが遅くなり、どこでも動作する安定したソリューションであるとは思えません。また、リクエストを送信しているサイトはMyAnimeListです。

4

1 に答える 1

0

よし、やっとデバッグできた。非同期アクセスが必要なクラスの 1 つで内部 QNetworkAccessManager を削除したことが判明しました。それと、Qt5.3 への更新で問題が解決したようです。

于 2014-05-25T17:29:46.363 に答える