Qt学习笔记——线程相关(暂时这么记

自学理解的内容,所以或许会有错误= = ,暂时记着

大部分内容来自豆子大大的 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进行异步操作
  • 将任务分割成若干部分          有其他更加简便的方式进行

你可能感兴趣的:(Qt)