1

プラグインに大きく依存するアプリケーションを構築しています。コアはシリアル インターフェイスからデータを取得し、それを各プラグインに配信して、それぞれがそれをどう処理するかを決定できるようにします。

私の設計では、QMdiSubWindow を介して MDIArea にアタッチされたウィジェットをプラグインで構築できます。これは、ミューテックスが必要になるまで機能しました。すべてが同じスレッドで実行されていたため、非常に速くデッドロックが発生しました。したがって、各プラグインを別のスレッドに移動すると、これを解決できると思いました。問題は、(今のところ) QMdiSubWindow がもう作成されていないことです。なぜこれが起こっているのかわかりません。

コアは、シグナルとスロットを使用してプラグインと通信します。

これは、プラグインをロードしてスレッドに移動する方法です。

QPluginLoader loader( the_path );
QObject* plugin = loader.instance();
if( plugin!=0 )
{
    //Connect install subwindows request
    connect( plugin, SIGNAL(install_plugin_window(QString,QWidget*)), this, SLOT(onRequestInstallSubwindow(QString,QWidget*)) );

    QThread* consumer = new QThread;
    plugin->moveToThread( consumer );
    consumer->start();

    PluginInterface* pl = qobject_cast<PluginInterface*>(plugin);
    pl->registerSubWindow();
}

これは元のコードを簡略化したものであることに注意してください。この記事http://www.christeck.de/wp/2010/10/23/the-great-qthread-mess/に基づいて、このアプローチ(プラグインをスレッドに移動)に従いました

registerSubWindow() は、ウィジェットを作成するプラグインのメソッドです。

void PluginDrier::registerSubWindow()
{
    widget = new Form();
    emit install_plugin_window( "Plugin Widget", widget );
}

これは、生成されたウィジェットを上記の MdiSubWindow として登録する、このスロットでコアによってキャッチされるシグナルを発します。

void MainWindow::onRequestInstallSubwindow( QString title, QWidget* content )
{
    QMdiSubWindow* subwindow = ui->mdiArea->addSubWindow( content );
    subwindow->setWindowTitle( title );
    subwindow->setWindowFlags( Qt::CustomizeWindowHint | Qt::WindowTitleHint |     Qt::WindowMinMaxButtonsHint );
}
4

1 に答える 1

1

GUI スレッドでのみ動作する Qt ウィジェット。プラグインの内部操作を別のスレッドに移動しようとすることもできますが、すべての GUI はメイン スレッドに残す必要があります。

これを試して:

void PluginDrier::registerSubWindow()
{
    widget = new Form();
    widget->moveToThread(QApplication::instance()->thread ());
    emit install_plugin_window( "Plugin Widget", widget );
}

しかし、私はそれをテストしていないので、うまくいかないかもしれません。また、私のソリューションが機能する場合、内部ロジックと GUI の間のすべての通信はスレッドセーフである必要があることに注意してください。

于 2011-07-20T10:47:41.970 に答える