- 使用
QThread
创建线程是我们最常见的一种方式,步骤如下:- 继承
QThread
- 重写
run()
函数 - 通过
start()
函数启动线程
- 继承
- 优点:可以通过信号槽与外界进行通信。
- 缺点:
- 每次新建一个线程都需要继承
QThread
,实现一个新类,使用不太方便。 - 要自己进行资源管理,线程释放和删除。并且频繁的创建和释放会带来比较大的内存开销。
- 每次新建一个线程都需要继承
- 适用场景:
QThread
适用于那些常驻内存的任务。
moveToThread
是在QThread
的用法基础上扩展出来的,它是QObject
的接口,相对QThread
线程方式来说,moveToThread
使用更灵活,不需要继承QThread
,也不用重写run
函数。只需要将一个继承于QObject
的类通过moveToThread
移到QThread
的一个对象中。- 需要注意的是:
- 只有在槽中执行的操作才是在线程中执行的,所以需要通过连接信号槽的方式来实现
- 如果object对象存在父对象,不能将其移到子线程中执行。
- 优点:无需手动释放资源,
QThreadPool
启动线程执行完成后会自动释放。 - 缺点:不能使用信号槽与外界通信。
- 适用场景:
QRunnable
适用于线程任务量比较大,需要频繁创建线程。QRunnable
能有效减少内存开销。