QThread的两种使用方法
不使用事件循环。官方manual介绍的一种方法
1) 子类化QThread
2) 重载run函数,run函数内有一个死循环
3) 设置一个标记位来控制死循环的退出
如果使用这个方法,那么QThread::quit()就没有效果,因为这个线程不需要事件循环。这个时候使用QT不推荐的terminate()使用事件循环
1) 子类化QThread
2) 重载run使其调用QThread::exec()
3) 并为该类定义信号和槽,这样一来,由于slot函数并不会在新开的thread运行,很多人为了解决这个问题在构造函数中调用moveToThread(this)
QThread应该被看做是操作系统线程的接口或控制点,而不应该包含需要在新线程中运行的代码。需要运行的代码应该放到一个QObject子类中,然后将该子类的对象moveToThread到新线程中。
QThread分析
QThread代表一个线程,我们可以重新实现QThread::run()。要新建一个线程,我们应该先继承QThread并重新实现run()函数。
注意:
- 必须在创建QThread对象之前创建QApplication(继承自QCoreApplication和QGuiApplication)
- QCoreApplication::exec()必须只能从主线程调用,不能从QThread线程调用。
1 | class MyThread : public QThread { |
我们可以在这样调用:
1 | MyThread thread; |
当然我们开的线程可能要运行很久,会卡住主线程,可以使用QeventLoop进行轮转。
1 | MyThread thread; |