-
QThread继承于QObject,代表一个线程,每个线程都有自己的事件循环。
-
初始线程通过QCoreApplication::exec()开启事件循环,单dialog应用通过QDialog::exec()开启,其他线程通过QThread::exec()开启
-
每个QObject对象都生存(live)于其被创建的线程中。查看QObject对象所在线程可调用thread()
-
QObject::moveToThread()可改变对象的线程亲和性(thread affinity)。如果有父对象则不能move。
-
在非QObject对象所属线程delete该对象是不安全的,除非能保证该对象没有正在处理事件(events),应使用deleteLater
-
如果事件循环没有在运行,事件将不会传递给对象。线程安全函数QCoreApplication::postEvent()可以在任意线程手动传递传递给任意对象事件。QCoreApplication::sendEvent()则只能给同线程的对象传递事件。
-
事件过滤器(Event filter)要求监控与被监控对象处于同一个线程中
-
QObject不是线程安全的,因此在非对象所属线程中调用该对象函数且对象可能在处理事件时,应该加锁,否则可能导致崩溃。
-
QObject类可重入,其大部分非UI子类也是**可重入(reentrant)**的,可重入(reentrant)意味着在不同线程中创建若干个QObject实例能同时各自调用。这些类被设计为在单一线程中使用,这意味着我们不能在A线程中创建对象而在B线程中调用其函数
-
有三条约束规则
- QObject对象的孩子必须在"其父对象所创建的线程中"创建
- 事件驱动对象只能用于单线程
- QThread线程删除所有在线程内创建的对象
-
GUI类必须在主线程中使用
-
QObject必须在QApplication创建后使用,这意味着不存在static的QObject类
-
信号、槽、线程
- 连接类型
- Auto Connection。如果信号是在接收对象所亲和的线程中发出的,则行为与直接连接相同。否则,行为与排队连接相同。”
- Direct Connection 。当信号发出时,槽会立即被调用。槽在发射信号的线程中执行。
- Queued Connection。当控制返回到接收者线程的事件循环时调用该槽,槽在接收者的线程中执行。
- Blocking Queued Connection。与Queued Connection相同,不同的地方在于会阻塞直到槽函数返回。同线程将导致死锁
- Unique Connection。与Auto Connection相同,不同的地方在于如果已经存在完全相同的连接,则不进行连接。