QThread架构中QObject间通讯常见误区澄清

来源:互联网 发布:新手如何快速入门seo 编辑:程序博客网 时间:2024/05/16 15:06

1. QObject对象属于创建线程,下面两个函数可以获得/修改其所属线程;

voidmoveToThread ( QThread * targetThread )QThread * thread () const

2. QThread是线程管理对象,管理着一个线程,但它也是QObject的派生类,所以属于创建他的线程(区分线程管理对象与线程很重要)。

3. QObject::connect函数有5种ConnectionType,缺省type=AutoConnection,这意味着:

a. 当收发线程属于同一线程时,采用DirectConnection方式通讯,等价于函数调用。

b. 当收发线程属于不同线程时,采用QueuedConnection方式通讯,这是一种异步通讯方式,简单地说就是讲signal放入队列,由接收线程再次进行派发。


4. 这意味着发送signal给QThread对象时,signal的接收线程其实是QThread对象的创建线程,而不是QThread所管理的对象。


5. 写QThread代码时要注意区分调用者是创建线程还是被管理线程,尽量不要让QThread对象负责线程创建之外的职责。


6.  对3.b的补充,如果要让QThread::run()中创建的QObject能够接收Queued Signal,必须在QThread的循环中调用exec()函数,这类似于QApplication中的QEventLoop。