1
我有一個Qt5應用程序,它使用QNetworkAccessManager
作爲可通過單例訪問的網絡請求,並使用QPluginLoader
來加載將功能添加到程序的擴展。目前我使用靜態鏈接插件和一切正常,很好。跨DLL使用QNetworkAccessManager
但是我想切換到使用動態庫來分離核心功能與應用程序的其他部分。我通過宏添加了必要的declspec
,並在我的.pro文件中做了必要的調整。
問題是,很多時候(比如,4個啓動中的3個)QNetworkAccessManager
從dll中使用時只返回空的請求或空指針。沒有數據,沒有錯誤字符串,沒有標題。
這是我使用的代碼加載插件:
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);
,它工作正常,但加載速度變慢,我非常懷疑它是一個穩定的解決方案,可以在任何地方工作。 另外,我發送請求的網站是MyAnimeList。
向我們展示如何使用QNetworkAccessManager。我想你只是不等待它的反應。 – Bogdan
@Bogdan在應用程序的一部分中,我使用一個使用'QEventLoop'同步它的包裝器。 (https://github.com/VeriTi/malstylerqt/blob/dll_heaven/base_app/networking/requestmanager.cpp)另一方面,我從'QNetworkReply'異步解析一些XM。 (https://github.com/VeriTi/malstylerqt/blob/dll_heaven/mod_covers/blink/blinkparser.cpp) –
您的消息對我來說似乎還可以。你是什麼意思,你從QNetworkAccessManager獲得nullptr?如果你得到了QNetworkReplay == nullptr,那麼恕我直言,這是一個Qt錯誤,你可以重播沒有數據,但肯定沒有nullptr(就像我理解Qt文檔一樣)。 – Bogdan