当前位置: 首页 > news >正文

网站建设与开发考试网址导航浏览器下载

网站建设与开发考试,网址导航浏览器下载,如何制作自己的个人网站,网站被收录后又被提出了目录前言1.线程池原理介绍2.QThreadPool详细介绍反复执行同一个任务设置线程过期时间线程数量信息3.QThreadPool示例4.总结前言 线程池顾名思义就是同时管理多个线程的"池子",它是一种并发处理技术,在程序中使用线程池能够提高线程的使用效率…

目录

      • 前言
      • 1.线程池原理介绍
      • 2.QThreadPool详细介绍
          • 反复执行同一个任务
          • 设置线程过期时间
          • 线程数量信息
      • 3.QThreadPool示例
      • 4.总结

前言

线程池顾名思义就是同时管理多个线程的"池子",它是一种并发处理技术,在程序中使用线程池能够提高线程的使用效率,提高程序的稳定性。 本文从线程池的实现原理开始,介绍了QT框架里的线程池QThreadPool,并提供一个使用示例。

1.线程池原理介绍

线程池的实现思路大致是这样的,在程序启动时创建一定数量的线程交给线程池管理,它通过一个任务队列来给各个线程分配任务。当需要使用线程处理一些任务时,就把这些任务扔给线程池,让线程池决定这些任务由哪个线程执行。当空闲线程多的时候,线程池可以自动销毁空闲的线程,当线程不够用时线程池也能自动创建新的线程来执行任务。当然了,通常我们会对线程池设置一个最大线程数量。
使用线程池有以下几个好处:

  1. 提高程序效率:由于线程池中已经预先创建了一定数量的线程,因此无需每次都创建和销毁线程,从而降低了系统开销。
  2. 提高响应速度:任务可以很快地分配给线程处理,从而提高了程序的响应速度。
  3. 提高稳定性:使用线程池可以有效地控制系统资源的使用,避免了过度占用系统资源导致系统崩溃或死锁的风险。
  4. 提高可扩展性:线程池的大小可以动态调整,可以根据需要增加或减少线程数量,从而满足不同工作负载的需求。

在这里插入图片描述

2.QThreadPool详细介绍

QThreadPool是一个用于管理线程池的Qt类,它通过管理和复用QThread线程对象来减少线程频繁创建销毁所带来的系统资源消耗。每个Qt应用程序都有一个全局的线程池对象,我们可以通过QThreadPool::globalInstance()单例方法获取。

要使用线程池必须将任务类继承自QRunnable,并实现虚函数run(),例如:

class TaskOne : public QRunnable
{void run() override{qDebug() << "Hello world from thread" << 		QThread::currentThread();}
};TaskOne *task = new TaskOne();
// 默认情况下task归线程池所有,并在执行结束后自动删除。
QThreadPool::globalInstance()->start(task);
反复执行同一个任务

task可以反复执行,前提是在调用QThreadPool::start()函数之前,调用task->setAutoDelete(false),这样task任务执行完后就不会被QThreadPool删除。

设置线程过期时间

QThreadPool中的线程有个默认的过期时间30s,过期后线程会自动退出直到线程的start函数被再次调用。通过调用setExpiryTimeout()设置过期时间,如果设置一个负值,则线程永不过期。

线程数量信息

我们通过调用maxThreadCount()获取线程池中能使用的最大线程数量,该值可以通过setMaxThreadCount()来设置。调用 activeThreadCount()函数获取正在工作的线程数量。

3.QThreadPool示例

下面是一个简单的的QThreadPool应用示例。

#include <QRunnable>
#include <QThreadPool>
#include <QDebug>class MyTask : public QRunnable {
public:MyTask(int id) : id(id) {}void run() override {qDebug() << "Starting task " << id;// Do some workqDebug() << "Finished task " << id;}private:int id;
};int main(int argc, char *argv[])
{QThreadPool::globalInstance()->setMaxThreadCount(4);for (int i = 0; i < 10; ++i) {auto task = new MyTask(i);QThreadPool::globalInstance()->start(task);}QThreadPool::globalInstance()->waitForDone();return 0;
}

在上例中我们设置线程池的最大线程数为4,并循环创建了10个MyTask对象添加到线程池中。最后,我们调用waitForDone()函数等待所有任务完成。具体任务是在MyTask的run函数中执行的,可以通过传递不同的参数来执行不同的任务。

4.总结

QThreadPool的使用场景是执行长时间耗时的工作时。如果需要执行某些任务,又不想阻塞UI线程,我们就可以将这些任务放入线程池中并在后台运行,而不影响UI的响应速度。

QThreadPool的一般使用步骤如下:

  • 1.创建QRunnable的子类来表示要执行的任务。
  • 2.创建QThreadPool对象,并使用setMaxThreadCount()函数设置线程池中的线程数。
  • 3.创建一些QRunnable对象并调用QThreadPool::start()函数将它们添加到线程池中。
  • 4.等待所有任务完成,可以调用waitForDone()函数等待任务完成,也可以通过信号和槽获取任务结束信号。

以上就是本文的所有内容了,有问题欢迎指正,谢谢!

http://www.ds6.com.cn/news/40373.html

相关文章:

  • 辽宁省建设工程信息网官网新网站入口官方广告sem是什么意思
  • 西宁网站开发深圳最新新闻事件今天
  • 专用主机方式建设网站竞价网站
  • 做外贸生意哪个网站好百度网盘资源共享
  • 网站建设华为怎么做一个网站出来
  • 建设部网站公示百度搜索收录入口
  • 服务器上的网站怎么做301蜜雪冰城推广软文
  • 免费建站分类信息网网络销售靠谱吗
  • 打开网站说建设中是什么问题自动引流推广软件
  • 企业建设网站方案设计电商运营推广是做什么的
  • 广州门户网站制作公司sem推广外包
  • 专门做游戏交易的网站微信小程序怎么开通
  • 怎么看个人做的付费视频网站网上教育培训机构哪家好
  • 做网站去哪里可以找高清的图片公司网络营销推广方案
  • 学校网站怎么做重庆seo代理计费
  • 企业网站导航代码东莞百度seo在哪里
  • 项目网站分析seo专业学校
  • 网站建设需要的技术国家免费技能培训有哪些
  • 做动态网站的软件百度推广退款电话
  • 教育网站首页源代码中文域名交易平台
  • 网站建设需要技术网络营销技能大赛优秀作品
  • 如何自己做网站界面什么软件可以搜索关键词精准
  • 网站建设及维护服务器今日微博热搜榜前十名
  • 做企业网站服务免费手游推广平台
  • wordpress表单联系关闭站长工具seo综合查询
  • 域名注册完成后怎么做网站太原网站优化公司
  • wordpress 子站点函数哪些行业适合做seo
  • 淘宝做促销的网站线上直播营销策划方案
  • 做冰淇淋生意网站近期新闻事件
  • 合肥做双语外贸网站东莞网站推广大全