自学理解的内容,所以或许会有错误= = ,暂时记着
大部分内容来自豆子大大的 Qt学习之路2
QThread类
继承QThread类
重写run()函数实现线程动作
可调用exec()函数进行线程循环
new 一个对象
通过该对象的start()函数启动线程
class Thread : public QThread
{
protected:
void run() {
/* ... 初始化 ... */
exec();
}
};
有关线程,做的是:
-
在QThread子类添加信号。这是绝对安全的,并且也是正确的(前面我们已经详细介绍过,发送者的线程依附性没有关系)
不应该做的是:
-
调用
moveToThread(
this
)
函数 -
指定连接类型:这通常意味着你正在做错误的事情,比如将QThread控制接口与业务逻辑混杂在了一起(而这应该放在该线程的一个独立对象中)
-
在QThread子类添加槽函数:这意味着它们将在错误的线程被调用,也就是QThread对象所在线程,而不是QThread对象管理的线程。这又需要你指定连接类型或者调用
moveToThread(
this
)
函数-
connect一般是在主线程进行调用。
-
关于此处,意思为,connect 链接的槽函数,需独立出来,放在一个类中,不应该放在QThread中,而且,需要进行这个线程槽函数操作,可选择槽函数独立写一个类,然后槽函数增加信号,使用另外的一个对象的信号链接QThread子类的信号,QThread子类链接独立类的槽函数来完成操作
-
-
使用QThread
::terminate()
函数
不能做的是:
-
在线程还在运行时退出程序。使用QThread
::wait()
函数等待线程结束 -
在QThread对象所管理的线程仍在运行时就销毁该对象。如果你需要某种“自行销毁”的操作,你可以把
finished()
信号同deleteLater()
槽连接起来
那么,什么时候应该使用线程?
- 当你不得不使用同步 API 的时候。
- 当你希望扩展到多核应用的时候。
- 当你不想被别人阻塞的时候。
那么,什么情况下不应该使用线程?
- 定时器 有了更加简便的操作,使用定时器进行定时任务明显是个更好的选择
- 网络/状态机 在Qt中网络部分的操作已经是异步的了,所以不需要用上QThread进行异步操作
- 将任务分割成若干部分 有其他更加简便的方式进行