2011-07-20 2 views
1

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

私のデザインでは、プラグインはQMdiSubWindowを介してMDIAreaに接続されたウィジェットを構築できます。 これは、すべてが同じスレッドで実行されていたので、私はデッドロックが非常に速くなったため、mutexが必要になるまで機能しました。 だから、私は別のスレッドに各プラグインを移動することがこれを解決することができます。問題は、(今のところ)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(); 
} 

これは元のコードを簡略化したものであることに注意してください:

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

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

catchedされる信号を発する: 私はこの記事にhttp://www.christeck.de/wp/2010/10/23/the-great-qthread-mess/

registerSubWindow()ウィジェットを作成し、私のプラグインでの方法があるが基づか(スレッドへの私のプラグインを動かす)このアプローチを踏襲しました上述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); 
} 

答えて

1

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

はこのお試しください:

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

をしかし、私は動作しないことがあり、それをテストしていません。また、私のソリューションがうまくいくならば、内部ロジックとGUI間のすべての通信はスレッドセーフでなければならないことに留意してください。

+0

onRequestInstallSubwindow()のGUIスレッドにウィジェットをより良く移動できますか? –

+0

問題は、ウィジェットがメインスレッドになければならないということです。ウィジェットを別のスレッドで作成する際の価値は何ですか?データの読み込みを別のスレッドに移して、すべてのGUI操作をメインのものに保つ方が良いと思います。 –

+0

どうすれば私のプラグインを2つに分けることができますか?プラグイン内にWorkerオブジェクトを含めると、すべての内部ロジックが含まれ、Workerオブジェクトが新しいスレッドに転送される可能性があります。 –

関連する問題