找回密码
 立即注册
Qt开源社区 门户 查看内容

Qt线程池

2019-8-25 06:46| 发布者: admin| 查看: 1950| 评论: 0

摘要: 线程池概念: 线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行 ...
线程池

概念:

       线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。

工作机制:

        在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给某个线程,线程池在拿到任务后,就在内部寻找是否有空闲的线程,如果有,则将任务交给某个空闲的线程。一个线程同时只能执行一个任务,但可以同时向一个线程池提交多个任务。

起因:

   多线程运行时间,系统不断的启动和关闭新线程,成本非常高,会过渡消耗系统资源,以及过渡切换线程的危险,从而可能导致系统资源的崩溃。这时,线程池就是最好的选择了。

其他:

         C++没有提供线程池,但C++11提供了线程等。所以C++也可手动实现线程池功能,这样更加灵活。但本文只介绍Qt线程池。需要了解C++11实现线程池请查看下一篇文章。

正文

描述

 QThreadPool支持多次执行相同的QRunnable,通过调用 QThreadPool::tryStart(this) 从 run() 函数内。如果启用了 autoDelete,当最后一个线程退run() 函数,QRunnable 将被删除。多次调用 QThreadPool::start() 使用相同的 QRunnable,当启用 autoDelete 时会创建一个竞争条件,不推荐使用。QThread::idealThreadCount()提供了计算程序运行所在平台上支持的辅助线程的最佳数量 - 考虑到操作系统、处理器的数量和机器拥有的处理核的数量。

基本使用:

      首先继承QRunnable,该类是所有 runnable 对象的基类, 用于表示一个任务或要执行的代码,需要重新实现run() 函数。继承QObject是因为QRunnable没有继承自QObject,所以无法使用某些Qt属性。接着实现 run() 虚函数。

    如图:





然后创建一个对象,并把它传递给 QThreadPool::start() - 这会把可运行对象的拥有权赋给 Qt 的全局线程池,并可以让它开始运行。



最后

        注意, QThreadPool 类用于管理 QThreads 集合。此时我们创建的对象依附在堆上,但QThreadPool会帮我们管理并释放。默认情况下,当可运行对象结束时,线程池会自动将其删除,这也正是我们想要的效果。在某些情况下,如果必须由我们自己负责删除可运行的对象时,可以通过调用 QRunnable::setAutoDelete(false) 来阻止自动删除的发生。另外如果想要槽函数在次线程中执行,只需改变信号槽的连接方式Qt::DirectConnection。

线程池一般不需要退出,当需要退出时可以使用QThreadPool::waitForDone(ms)等待所有线程运行结束并退出,参数为等待时间-1表示一直等待到最后一个线程退出。

后续

本人测试一段可以使用,每次只需要将任务写入队列即可:



邮箱发送收集缓慢,着急朋友下载Qt的线程池代码源码了解:
https://download.csdn.net/download/automoblie0/11605480


----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:Qt开发者中心,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了