在QThread中生成的QObject丢失了内部信号/插槽连接

时间:2011-11-27 13:04:17

标签: c++ multithreading qt signals-slots qthread

我有一个工人QThread,其中创建了一个QObject派生对象。该对象是另外两个QObject派生对象的集合,因此有内部连接用于信号链接和将两个内部对象绑定在一起。

工作人员QThreadQPlugin的成员,因此在插件的整个生命周期中都存在。

我遇到的问题是,尽管该对象与应用程序的其余部分进行了良好的交互,但这些内部连接似乎已被破坏。作为一个实验,我尝试在主线程中创建对象,并且内部连接正在运行,所以这肯定是我在QThread s做错了。

我也尝试将对象移回主线程(不可否认的是,在建立内部连接之后),但它没有效果。我循环遍历内部连接的每种类型的连接(直接,排队等),但它要么没有效果,要么触发死锁错误。通过连接传递的所有类型都已注册。

对象是两个包含对象的父QObject,它们应该没有区别,因为它们都驻留在同一个线程中,但我尝试将它们的父设置为NULL只是为了排除它 - 它不出意料地没有效果。 QThread 不是任何内容的父级。

我唯一不确定的是该对象是从驻留在主线程中的工厂单例创建的,但是是从工作线程调用的 - 所以它属于谁?我完全不知道我正在做什么(或不做什么)来打破这些联系,所以任何帮助都非常感谢。以下是应用程序相关部分的代码:

这是工作线程中的对象创建调用,对于上下文,对象是来自OBJ导入器的多边形网格。

//  Create mesh.
QString type = Sy::plugMeshType + "Sy_polyMesh";
QString name = proj->newNameIncrement( "objMesh" );

Sy::PluginArgs args; args << name;
Sy_polyMesh* obj = Sy_pluginLoader::createInstance< Sy_polyMesh >( type, args );
obj->mesh() = mesh;
obj->resizeBB();
result_ = obj;

//  If in GUI mode, register it with the project.
if ( gui_ ) {
    proj->registerSimObject( obj );
    proj->selectObject( obj );
}

我的应用程序有相当广泛的插件架构,因此实际的线程启动代码被抽象为抽象的工作类:

void Sy_abstractLongProcess::begin( Sy_abstractLongProcessWorker* worker )
{
    worker_ = worker;
    worker_->moveToThread( &thread_ );

    QObject::connect( &thread_, SIGNAL( started() ), worker_, SLOT( work() ) );

    QObject* thisObj = dynamic_cast< QObject* >( this );

    QObject::connect( &thread_, SIGNAL( finished() ), worker_, SIGNAL( finished() ) );
    QObject::connect( worker_, SIGNAL( finished() ), thisObj, SIGNAL( finished() ) );
    QObject::connect( worker_, SIGNAL( progressChanged( double ) ), thisObj, SIGNAL( progressChanged( double ) ) );
    QObject::connect( worker_, SIGNAL( finished() ), &thread_, SLOT( quit() ) );

    thread_.start();
}

由于所有相关代码分布在很多课程中,我不会列出所有内容(这个问题已经足够长了),但是如果你需要查看其他内容,请不要犹豫 - 我需要得到所有这方面的帮助。

1 个答案:

答案 0 :(得分:0)

我在原帖中几乎得到了答案,当我试图将对象移回主线程时,只是我做得太早了。一旦我完成了需要在工作线程中完成的修改,我就不得不将其移回 - 现在看来很明显!

感谢Mat让我顺利完成工作