• Qt线程


    1. QThread

    (1)QThread是一个跨平台的多线程解决方案

    (2)QThread以简洁易用的方式实现多线程编程

    (3)绝大多数情况下需要继承这个QThread类创建属于自己的多线程的类

    2.Qthread中的几个重要成员函数:

    (1)virtual void run()函数
    线程函数,用于定义线程功能(执行流)。
    该函数是线程入口地址、线程体函数,用于定义线程功能(线程就是一个执行流、即执行的顺序)
    直接调用该函数就会产生一个线程吗?
    不会,要想启动一个线程需要调用start()的成员函数,start()函数从操作系统角度真正创建一个线程
    (2)void start()
    线程的启动函数,将线程的入口地址设置为run函数启动线程,新线程开始执行run函数
    用start函数就会产生一个子线程,然后该线程从run函数开始执行。每次执行start()函数就相当于新创建一个线程
    一定不要以为调用stop函数线程停止,调用start函数线程重新启动
    (3)void terminal()
     强制结束线程函数(不推荐)

    (4)int exec()进入事件循环,直至调用exit()。返回线程退出事件循环的返回码。

     1 #include <QtCore/QCoreApplication>
     2 #include <QThread>
     3 #include <QDebug>
     4 
     5 class MyThread : public QThread
     6 {
     7 protected:
     8     void run()
     9     {
    10         qDebug() << objectName() << " : " << "run() begin";
    11 
    12         for(int i=0; i<5; i++)
    13         {
    14             qDebug() << objectName() << " : " << i;
    15 
    16             sleep(1);
    17         }
    18 
    19         qDebug() << objectName() << " : " << "run() end";
    20     }
    21 };
    22 
    23 int main(int argc, char *argv[])
    24 {
    25     QCoreApplication a(argc, argv);
    26 
    27     qDebug() << "main() begin";
    28 
    29     MyThread t;
    30 
    31     t.setObjectName("t");
    32 
    33     t.start();
    34 
    35     MyThread tt;
    36 
    37     tt.setObjectName("tt");
    38 
    39     tt.start();
    40 
    41     qDebug() << "main() end";
    42     
    43     return a.exec();
    44 }

    3.线程对象和线程的生命周期

    (1)线程对象的生命期

      ①线程对象指的是由QThread类定义的一个对象,是一个Qt对象。其生命周期与一般的Qt对象具有相同的特点

      ②每个Qt对象都关联唯一一个线程环境,对象有明确的线程属性。当一个对象在某线程中,这就和该线程建立血缘关系,这种关系会一直保持到它死去或者被moveToThread到另一个线程中。

    (2)线程的生命期

     
    (3)线程何时死亡?
    • 正常死亡(完成线程的任务后)
    • 非正常(意外的状态)当调用terminal函数时
    • 工程中禁止使用函数terminal,因为terminal有可能资源没有被释放当产生的数据有可能是不能用的数据
    (4)如何优雅地中值进程的结束?
    • 思路:run函数执行结束就是安全中止线程的唯一方式
    • 解决:在线程中使用标志性变量
    如:volatile bool m_stop;
    根据m_stop的值判断是不是需要结束线程循环,进而中止线程
     
     
  • 相关阅读:
    Visual Studio Code 配置C/C++环境
    二叉链的基本操作
    回文自动机
    吊打线段树的超级树状数组
    Treap平衡树
    uni-app nvue页面动态修改导航栏按钮
    uni-app map组件关于marker标记点动态设置的问题
    uni-app 提示 v-for 暂不支持循环数据
    uni-app APP端隐藏导航栏自定义按钮
    uni-app路径规划(打开第三方地图实现)
  • 原文地址:https://www.cnblogs.com/zhaobinyouth/p/11801587.html
Copyright © 2020-2023  润新知