2014-05-05 28 views
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

+0

向我們展示如何使用QNetworkAccessManager。我想你只是不等待它的反應。 – Bogdan

+0

@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) –

+0

您的消息對我來說似乎還可以。你是什​​麼意思,你從QNetworkAccessManager獲得nullptr?如果你得到了QNetworkReplay == nullptr,那麼恕我直言,這是一個Qt錯誤,你可以重播沒有數據,但肯定沒有nullptr(就像我理解Qt文檔一樣)。 – Bogdan

回答

0

好的,現在我終於調試了它。原來,我刪除了需要異步訪問的一個類中的內部QNetworkAccessManager。那並且更新到Qt5.3似乎解決了我的問題。