铅笔

在你的害怕中坚持的越多,你就会越自信
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Qt线程

Posted on 2019-11-05 20:57  黑色の铅笔  阅读(595)  评论(0编辑  收藏  举报

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的值判断是不是需要结束线程循环,进而中止线程