当前位置 博文首页 > fearlazy:Qt的线程池QThreadPool

    fearlazy:Qt的线程池QThreadPool

    作者:[db:作者] 时间:2021-06-18 12:36

    ?

    文章可能被更新,最新地址:http://www.fearlazy.com/index.php/post/93.html

    ? ? ?

    ?

    ? ? 线程可以帮助我们处理耗时的操作以防止界面卡死,也可以提高程序的并发性。但线程也不是创建越多越好,因为创建、销毁线程以及切换线程都是需要消耗资源的。线程池技术的出现就是为了解决这个问题。线程池维护一定数量的线程,并充分使用它们。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()可以获得这个对象。不用怀疑拿起来用就是了,出了问题我又不负责任。

    下一篇:没有了