由于疫情原因被封控在家,相信大家也有跟我类似的情况,在学习知识提升和充实自己,下面我将这几天在学习的Qt多线程编程做个简单的总结,随此笔记的还有几个简单的例子,以便后续开发过程中回忆和参考。
Qt的多线程开发,目前学习了有4种方法,按照我目前的学习顺序,简单做下介绍,分别是:
一、继承QThread,重写run函数,在run函数内实现自己的耗时逻辑代码:
代码块:

最早接触的Qt多线程编程方式,优点:编码简单;缺点:功能单一,对于业务复杂的情况下,需要多个QThread子类,(仅是个人见解,如有不妥欢迎指正)。
二、像平时我们写功能类一样,继承QObject,将多个业务处理逻辑分别写成不同的槽函数:
代码块:
子线程的两个处理槽函数:

使用代码:

通过moveToThread的方式将我们业务处理类放到子线程中,通过信号的方式触发业务处理类中的槽函数,具体的可以看附件的代码。
三、Qt线程池,需要我们继承QRunnable,值得注意的是QRunnable不是QObject的派生类,所以单独的继承QRunnable的话,没办法使用Qt的信号槽机制,如果有业务要求,可以采用双重继承的方式达到对外发送信号的效果。
代码块:继承QRunnable也是在run函数中实现逻辑,如果业务复杂也可以将相对独立的功能代码用独立的函数实现,run中调用即可。 
使用代码块:通过QThreadPool::globalInstance()得到全局的线程池对象,通过start接口将我们实例化的子线程处理类对象交给独立的线程。

这里要注意几点:
1.创建子线程处理类的时候不可以指定parent,不然会报跨线程处理的错误!
2.QThreadPool默认是自动回收我们的子类对象,当我们的run函数处理完以后。如果不希望QThreadPool自动回收我们的子类对象的话,通过QRunnable的setAutoDelete(false)实现。
3.通过QThreadPool的setMaxThreadCount()接口来达到线程池最大线程数量的设置,查看Qt的帮助文档我们可以得知,默认的数量是通过QThread::idealThreadCount()接口返回的即系统上可以运行的最理想的线程数量。
四、通过QtConcurrent将一个函数放到独立的线程中执行:
代码块:
1.无参数的函数:
2.有参数的函数: 
通过这么一调用,我们就能将“subThreadFunction”函数放到独立的线程中去执行了。
资源地址:(2条消息) Qt多线程编程实例,资源包含了4种多线程编程的简单实例-C++文档类资源-CSDN文库
最后,文章中介绍到的实例已上传到CSDN资源,开放下载,对于初学者,希望能够达到抛砖引玉的效果,对于大佬,欢迎指正。
















