Thread Affinity
线程亲和
A QObject instance is said to have a thread affinity, or that it lives in a certain thread. When a QObject receives a queued signal or a posted event, the slot or event handler will run in the thread that the object lives in.
QObject实例可以说是线程亲和的,它生存在某个线程中。当QObject收到一个队列信号(queue signal)或一个发布事件(posted event),槽或事件处理将在对象所生存的线程中运行。
Note: If a QObject has no thread affinity (that is, if thread() returns zero), or if it lives in a thread that has no running event loop, then it cannot receive queued signals or posted events.
注意:如果QObject没有线程亲和(就是说,如果thread()返回0),或者如果其生存在一个没有运行事件循环的线程中,则其不能收到队列信号或发布事件。
By default, a QObject lives in the thread in which it is created. An object's thread affinity can be queried using thread() and changed using moveToThread().
默认下,QObject生存在创建其的线程中。一个对象的线程亲和可以使用thread()查询,可以用moveToThread()改变。
All QObjects must live in the same thread as their parent. Consequently:
所有的QObject必须和它们的父亲生存在相同的线程。因此:
- setParent() will fail if the two QObjects involved live in different threads.
- 如果setParent()相连的两个QObject不在一个线程中,则会失败。
- When a QObject is moved to another thread, all its children will be automatically moved too.
- 当一个QObject被移到另一个线程,其所有的孩子都会被自动的移入。
- moveToThread() will fail if the QObject has a parent.
- 如果QObject有父母,则moveToThread()会失败。
- If QObjects are created within QThread::run(), they cannot become children of the QThread object because the QThread does not live in the thread that calls QThread::run().
- 如果QObject在QThread::run()中创建,则其不能成为QThread对象的孩子,因为QThread并不在它调用的线程中。
Note: A QObject's member variables do not automatically become its children. The parent-child relationship must be set by either passing a pointer to the child's constructor, or by calling setParent(). Without this step, the object's member variables will remain in the old thread when moveToThread() is called.
注意:QObject的成员变量并不会自动成为其孩子。父子关系必须通过给孩子的构造器传指针或调用setParent()设置。如果没有这个步骤,在调用moveToThread()后,对象的成员变量将会保持在之前的线程中。