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