码迷,mamicode.com
首页 > 编程语言 > 详细

Qt 线程 网络的 元对象模型

时间:2015-07-01 13:48:44      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:

QObject 与线程

QObject 以及许多其非GUI 子类都是线程安全的, 但是在一个线程中创建、在另一个线程中使用QObject则是不安全的。

  QObject 的子类必须与其父对象在一个线程中创建, 因此 QObject 不能以 QThread 为父类, 因为 QThread 毫无疑问是其它线程创建的。

  事件驱动对象仅在一个线程中有效:具体来说, 是时间事件和网络事件。

删除QThread 之前, 必须删除它拥有的所有 QObject。 这个一般是比较简单的, 仅仅需要你在栈里创建 QObject即可。

一个QObject 实例生存于创建它的线程之中,  与它有关的事件由这个拥有它的线程分派管理,使用 QObject::thread()  可以获得这个线程。

因此根据推测就可以知道,在 Application 之前创建的线程, QObject::thread() 返回 0; 使用  QObject::moveToThread() 可以改变它所在的线程, 但是这个函数不是线程安全的,并且只能在当前线程调用, 把该对象“push”到其它线程。  

线程中的事件循环

创建QObject 的线程对它有拥有权,对于QThread 也是如此(并非想象中的属于调用run的线程),  如果在其它线程中delete QObject, 必须保证这个QObject 没有事件发生(这个很难保证),。  因此, 如果必须这么做, 可以使用deleteLater, 这会导致一个 DeferredDelete  被post, 并且在 该Object执行完所有事件后调用。

         异步的postEvent 可以在任何时候向任何Object 发送事件, 而sendEvent 必须向同一个线程里的object发送事件。

         Event filters 所控制的objects 与 监听者必须在同一个线程里。

         线程内的object 在某些方面来说不是线程安全的, 比如说, 线程中的事件处理系统。 当线程切换时, 事件处理系统很可能发生混乱。

         但是, emit 过程是线程安全的。 可以通过connect 的附加参数决定 signal /slot的连接类型。 有如下几种类型:

    Auto Connection (default) If the signal is emitted in the thread which the receiving object has affinity then the behavior is the same as the Direct Connection. Otherwise, the behavior is the same as the Queued Connection."

    Direct Connection The slot is invoked immediately, when the signal is emitted. The slot is executed in the emitter‘s thread, which is not necessarily the receiver‘s thread.

    Queued Connection The slot is invoked when control returns to the event loop of the receiver‘s thread. The slot is executed in the receiver‘s thread.

    Blocking Queued Connection The slot is invoked as for the Queued Connection, except the current thread blocks until the slot returns.

    Note: Using this type to connect objects in the same thread will cause deadlock.

    Unique Connection The behavior is the same as the Auto Connection, but the connection is made only if it does not duplicate an existing connection. i.e., if the same signal is already connected to the same slot for the same pair of objects, then the connection is not made and connect() returns false.

 

     超时事件

         超时事件的优先级是最低的。 它会等待其它事件处理完毕才会发生。 因此, 程序的粒度决定了Timer 的精度。 QBasicTimer是Timer的一个简化版, 它不是 object 的子类。

Qt 线程 网络的 元对象模型

标签:

原文地址:http://www.cnblogs.com/aslistener/p/4612881.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!