Qt moveToThread:对象带来了什么资源

Qt moveToThread: What resources are brought with the object?

本文关键字:来了 什么 资源 对象 moveToThread Qt      更新时间:2023-10-16

假设我创建了一个QObject a,它有一个成员QObject b。(实际上,A和B都是QObject的子类,类A有一个成员B b。)

创建b时,其父级为0(默认值)。在代码中,如果我从未将b的父级设置为a,并且如果我调用movetothread()a移动到工作线程中,b也会移动到该线程中吗?

如果它没有被移动,如果我从工作线程(我将a移动到的线程)调用b.init(),该线程使用新运算符创建另一个以b为父级的QObject,那么我会得到以下错误,对吗?

QObject:无法为不同线程中的父级创建子级

作为QObject::moveToThread的Qt文档,状态为:-

更改此对象及其子对象的线程相关性 如果对象有父对象,则无法移动该对象。事件处理将在targetThread中继续

在这种情况下,父对象是通过在构造函数中传递父对象或通过调用子对象的setParent来设置其子对象的对象。它不是一个具有指向另一个对象的指针的对象。

在代码中,如果我从未将b的父级设置为a,并且如果我调用movetothread()将a移动到工作线程中,b也会移动到该线程中吗

所以,不,如果没有设置b的父级,并且在"a"上调用moveToThread,"b"仍将具有原始线程关联。

如果它没有被移动,如果我从工作线程调用b.init()

如果您已经将"a"而不是"b"移动到工作线程,那么不应该直接从工作线程调用b.init。相反,工作线程('a')中的对象应该为原始线程中的对象发出一个信号,以便从连接的插槽调用b.init

b也会被移到那个线程中吗?

不,QObject不知道ba的成员。(你没有说a是持有指向b的指针,还是直接持有b,但在这两种情况下答案都是一样的。)

那么我会得到以下错误,对吗?

QObject的子级必须始终在拥有父级的线程中创建。我不愿意说你肯定会犯错误,因为这种行为可能是不明确的。

请参见线程和QObject