Qt QPluginLoader已移动到线程

Qt QPluginLoader已移动到线程,qt,qthread,Qt,Qthread,我正在构建一个严重依赖插件的应用程序:核心从串行接口获取数据,并将其传递给每个插件,以便每个插件都可以决定如何使用它 我的设计允许插件构建一个小部件,该小部件通过QMBwindow连接到MDI区域。 在我需要互斥锁之前,这种方法一直有效,因为所有东西都在同一个线程中运行,我很快就遇到了死锁。 所以我认为将每个插件移动到不同的线程可以解决这个问题。问题是(现在),QMBwindow不再被创建,我不知道为什么会发生这种情况 内核通过信号和插槽与插件通信 这就是我加载插件并将其移动到线程中的方式: Q

我正在构建一个严重依赖插件的应用程序:核心从串行接口获取数据,并将其传递给每个插件,以便每个插件都可以决定如何使用它

我的设计允许插件构建一个小部件,该小部件通过QMBwindow连接到MDI区域。 在我需要互斥锁之前,这种方法一直有效,因为所有东西都在同一个线程中运行,我很快就遇到了死锁。 所以我认为将每个插件移动到不同的线程可以解决这个问题。问题是(现在),QMBwindow不再被创建,我不知道为什么会发生这种情况

内核通过信号和插槽与插件通信

这就是我加载插件并将其移动到线程中的方式:

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();
}
它发出一个信号,该信号由内核通过该插槽捕获,该插槽将生成的小部件注册为所述MDI子窗口:

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

Qt小部件仅在GUI线程中工作。您可以尝试将插件内部操作移动到不同的线程,但所有GUI必须保留在主线程中

试试这个:

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

但我没有测试,可能不起作用。另外,请记住,如果我的解决方案能够工作,那么内部逻辑和gui之间的所有通信都应该是线程安全的。

Qt小部件仅在gui线程中工作。您可以尝试将插件内部操作移动到不同的线程,但所有GUI必须保留在主线程中

试试这个:

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

但我没有测试,可能不起作用。另外,请记住,如果我的解决方案能够工作,那么您的内部逻辑和gui之间的所有通信都应该是线程安全的。

我可以更好地将小部件移动到onRequestInstallSubwindow()中的gui线程吗?问题是:如果小部件必须位于主线程中,那么在单独的线程中创建它们的价值是什么?在我看来,最好将数据读取转移到另一个线程中,并将所有GUI操作保留在主线程中。我如何将我的插件分为两部分?可能在我的插件中包含一个Worker对象,该对象将包含所有内部逻辑,并将该Worker对象传输到新线程?@clinisbut>我可以在onRequestInstallSubwindow()中将小部件移动到GUI线程吗不,您不能,那个操作必须在您创建对象的线程中完成。@clinisbut是的。使用worker对象的想法很好,您可以这样做。我可以更好地将小部件移动到onRequestInstallSubwindow()中的GUI线程吗?问题是:鉴于小部件必须位于主线程中,在单独的线程中创建它们有什么价值?在我看来,最好将数据读取转移到另一个线程中,并将所有GUI操作保留在主线程中。我如何将我的插件分为两部分?可能在我的插件中包含一个Worker对象,该对象将包含所有内部逻辑,并将该Worker对象传输到新线程?@clinisbut>我可以在onRequestInstallSubwindow()中将小部件移动到GUI线程吗不,您不能,那个操作必须在您创建对象的线程中完成。@clinisbut是的。工人对象的想法是好的,你可以这样做。