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です。