QThreadPool Class的翻译

QThreadPool Class的翻译

**QThreadPool 类用来管理QThread集。**QthreadPool 管理和循环调用QThread对象,这样多线程处理中可以减少资源的消耗。每一个Qt应用程序都有一个全局的QThreadPool对象,它可是通过globalInstance()来获取。

创建QThreadPool 线程,需要子类化QRunnable,重写run()虚函数。然后创建一个类的对象,然后将它移交到QThreadPool::start().

在这里插入图片描述
QThreadPool 默认会自动删除QRunnable。使用QRunnale::setAutoDelete()来改变auto-deletion 标志。

QThreadPool 通过tryStart(this)(与QRunable::run()一并),支持多次执行QRunable。如果autoDelete 使能,当run()函数中的最后一个线程退出时,QRunnable 会快速删除。如果autoDelete 使能,在同一个QRunnable 多次调用start(),会建立一个多个线程竞争的情形,这是不值得推荐的。

一段时间内,没有被使用的线程将会失效。默认的失效时间是30000微秒(30秒)。这个默认时间可以同setExPiryTimeout()函数来设置。如果设置的时间是一个负数,将会是超时的机制失效。

调用maxThreadCount()来查询最大支持的线程数。如果需要,可以通过调用setMaxThreadCount()函数来改变最大线程数。可以通过QThread::idealThreadCount()方法来查看默认的最大线程数。通过调用activeThreadCount()函数来获取当前活动的线程数。

reserveThread()函数会保留一个线程共外部使用。当你在处理线程的时候,使用releaseThread(),以便该线程可以重复使用。本质上,这两个函数会增减当前活动的线程数。当计算线程的耗时上,这个两个函数还是很实用的。

需要注意的是,QThreadPool 是更低一层的类用来管理线程。可以查阅更高一层的类Qt Concurrent 模型。

该类的属性介绍:

activeThreadCount:当前线程池里的活动线程。

expiryTimeout:超时时间。
请注意:设置expiryTimeout 对已经存在的的线程是没有效用的。只有对新建的线程才有用。
推荐在一开始创建线程池的时候,在调用start()函数前就设置好expiryTimeout。

maxThreadCount:当前线程池的最大线程数。

stackSize:线程池工作线程的栈大小。

成员函数:
QThreadPool::~QThreadPool()
销毁线程池。知道所有的runnables都已经完成,该函数将一直处在阻塞状态。

QThreadPool *QThreadPool::globalInstance()
返回全局线程池。

void QThreadPool::releaseThread()
释放之前一个被保留的线程。

void QThreadPool::reserveThread()
保留一个线程,忽略activeThreadCount()和maxThreadCount

void QThreadPool::start(QRunnable *runnable, int priority = 0)
保留一个线程并使用它运行runnable,除非此线程将使当前线程数超过maxThreadCount()。在这种情况下,runnable被添加到运行队列中。priority参数可用于控制运行队列的执行顺序。

bool QThreadPool::tryStart(QRunnable *runnable)
试图保留线程以运行runnable。

如果在调用时没有线程可用,则此函数不执行任何操作并返回false。否则,使用一个可用线程立即运行runnable,此函数返回true。

bool QThreadPool::tryTake(QRunnable *runnable)
尝试从队列中删除指定的runnable(如果尚未启动)。如果runnable尚未启动,则返回true,runnable的所有权将转移到调用方(即使runnable->autoDelete()==true)。否则返回false。

bool QThreadPool::waitForDone(int msecs = -1)
等待所有线程退出并从线程池中删除所有线程的时间最长为毫秒。如果删除了所有线程,则返回true;否则返回false。如果msec为-1(默认值),则忽略超时(等待最后一个线程退出)。

本篇翻译完毕,如有错误的地方,恳请读者们多多指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章