Qt线程

Posted zhaobinyouth

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)线程的生命期

 
技术图片

 

 

线程何时死亡?
1、正常死亡(完成线程的任务后)
2、非正常(意外的状态)当调用terminal函数时
工程中禁止使用函数terminal,因为terminal有可能资源没有被释放当产生的数据有可能是不能用的数据
如何优雅地中值进程的结束?
思路:run函数执行结束就是安全中止线程的唯一方式
在线程中使用标志性变量
如:volatile bool m_stop;
根据m_stop的值判断是不是需要结束线程循环,进而中止线程
 
 

以上是关于Qt线程的主要内容,如果未能解决你的问题,请参考以下文章

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

qt多个线程调用同一个类怎么处理

Qt如何循环创建线程

qt子线程如何传输数据给主线程

多线程代码中 QSerialPort 的 Qt 错误:QCoreApplication::sendEvent:“无法将事件发送到不同线程拥有的对象

Qt编程遇到的问题,我在qt中直接使用C语言的程序片段,有问题 ,求解