我有一个QThread
创建QObject
派生对象的工人。该对象是其他两个QObject
派生对象的集合,因此存在用于信号链接和将两个内部对象绑定在一起的内部连接。
workerQThread
是 a 的成员QPlugin
,因此在插件的整个生命周期中都存在。
我遇到的问题是,尽管该对象与应用程序的其余部分交互良好,但这些内部连接似乎已断开。作为一个实验,我尝试在主线程中创建对象并且内部连接正在运行,所以这绝对是我对 s 做错的事情QThread
。
我还尝试将对象移回主线程(诚然,在建立这些内部连接之后),但它没有效果。我为内部连接循环了每种类型的连接(直接、排队等),但它要么没有效果,要么触发了死锁错误。通过连接传递的所有类型都被注册。
该对象是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();
}
由于所有相关代码都分布在许多类中,因此我不会列出所有内容(这个问题已经足够长了),但是如果您需要查看其他任何内容,请不要犹豫 - 我需要我能获得的所有帮助一。