2012-04-09 13 views
3

Das Problem tritt auf, wenn ich versuche, ein geladenes Plugin zu entladen und ein neues zu laden. Also werden beide Plugins korrekt geladen, aber beim Wechsel (zuerst wird geladen, zweite wird entladen und umgekehrt) stürzt meine App ab. Was kann das Problem sein?Unload Plugin in Qt

Zuerst was ich tue Ich versuche, ein in einer QList von QPluginLoader gespeichertes Plugin zu entladen, dann überprüfe ich (depedend auf id (integer number) aus einem speziellen Menü zum Laden von Plugins) welches Plugin geladen werden soll. Erste Last ist gut (erstes Plugin geladen ist, nichts an dieser Stelle zu entladen), die zweite Last (entladen erste Plugin wird das zweite geladen), an der dritten Last i bekommen Absturz

void MainWindow::loadPluginUsingId (int plugin_id) { 

     foreach (QPluginLoader* pluginLoader, plugins) {   
       pluginLoader->unload(); 
       delete pluginLoader; 
       } 

     switch (plugin_id) { 

      case 0 : { 

      foreach (QString fileName, pluginDir.entryList(QDir::Files)) { 
       if (fileName == fullNameOfPlugins.value(plugin_id)) { 
        QPluginLoader* pluginLoader = new QPluginLoader(pluginDir.absoluteFilePath(fileName)); 
        QObject *plugin = pluginLoader->instance(); 

        IndicatorInterface *indicator = qobject_cast<IndicatorInterface*>(plugin); 
        indicator->initIndicator(); 
        plugins.append(pluginLoader); 
       } 
      } 
     } 

     break; 
      case 1 : { 

      foreach (QString fileName, pluginDir.entryList(QDir::Files)) { 

       if (fileName == fullNameOfPlugins.value(plugin_id)) { 

         QPluginLoader* pluginLoader = new   QPluginLoader(pluginDir.absoluteFilePath(fileName)); 
         QObject* plugin = pluginLoader->instance(); 
         PlotterInterface *plotter = qobject_cast<PlotterInterface*>(plugin); 
         plotter->initPlotter(); 
         plugins.append(pluginLoader); 
        } 
       } 
      } 
     break; 
      default : 
       break; 
      } 
} 
+1

Wo ist der Absturz? – Macke

+1

innerhalb der Forech-Schleife –

+0

Was ist der Typ von 'Plugins' in' foreach (QPluginLoader * pluginLoader, Plugins) '? – cgmb

Antwort

7
foreach (QPluginLoader* pluginLoader, plugins) {   
      pluginLoader->unload(); 
      delete pluginLoader; // this could be your problem 
      } 

Sie müssen entfernen der baumelnde Zeiger aus der Plugins-Liste. Wenn Sie dies nicht tun, führt dies zu dem, was Sie beschreiben.

Try this:

while (!plugins.isEmpty()) {   
    QPluginLoader* pluginLoader = plugins.takeFirst(); 
    pluginLoader->unload(); 
    delete pluginLoader; 
} 
+0

danke, es funktioniert. –

Verwandte Themen