QT下的线程池的使用方法

#转载:https://blog.csdn.net/can3981132/article/details/93663460?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160700370019724827642272%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160700370019724827642272&biz_id=0&utm_m

   

线程可以帮助我们处理耗时的操作以防止界面卡死,也可以提高程序的并发性。但线程也不是创建越多越好,因为创建、销毁线程以及切换线程都是需要消耗资源的。线程池技术的出现就是为了解决这个问题。线程池维护一定数量的线程,并充分使用它们。Qt封装的线程池类是QThreadPool,它的使用需要QRunnable来配合。概括一下使用步骤如下:

    1.从QRunnable派生一个类,重写run()函数。把需要子线程干的活放到run函数中。

    2.调用QThreadPool的start()开始工作,start的参数就是子类化QRunnable的指针。

     

    使用步骤很简单,写个例子

    1.用QtCreator新建一个基于QWidget的工程。

    2.新建一个类CTask,从QRunnable继承。并重写run函数。

blob.png

   3.在Widget中创建一个QThreadPool对象,并用它来启动10个任务。

blob.png

    运行结果:

    blob.png

    可以看到新建的任务在子线程中执行了。可喜可贺,不过好像哪里不对劲?有好几个线程是重复的。是的因为这个线程池的最大线程数是4。可以通过setMaxThreadCount来设置最大的线程数。

    线程池在执行完任务后会自动删除任务对象(在start中new出来的CTask),除非你使用setAutoDelete(false)。 QRunnable除了run也就这点本事了。下图为证。

blob.png

    最后提一点就是Qt为每个QApplication创建了一个线程池对象,通过QThreadPool的静态成员函数globalInstance()可以获得这个对象。不用怀疑拿起来用就是了,出了问题我又不负责任。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值