QThread在QThread中丢失内部信号/插槽连接

问题描述:

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

工作人员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

尝试重现在_much_简单的配置你的问题(两个对象,两个线程,一个信号/插槽)。这里有太多的事情我们不知道。 (而且dynamic_cast并不能保证你的类层次结构的复杂性。) – Mat

+0

好的通话,我会试着把一些东西敲在一起。 dynamic_cast很好,但是这些连接没有问题。 – cmannett85

我几乎在原岗位的答案,当我试图移动对象回主线程,只是我做的太早了。一旦我完成了需要在工作线程中完成的修改,我必须将其移回 - 现在看起来很明显!

感谢垫子把我的轨道上工作出来