线程池-Qt

10 篇文章 0 订阅

https://blog.csdn.net/no_pao_spite/article/details/81774008

QThreadPool类使用:

//pro文件
Qt += core
//头文件包含   
#include <QThreadPool>
介绍:

     QThreadPool类管理了一个线程的集合。QThreadPool管理和回收QThread对象,以帮助减少使用线程的程序在线程创建的开销。每一个Qt应用程序有一个全局的QThreadPool对象,可以使用欧冠globalInstance()获取。使用QThreadPool中的一个线程可以子类化QRunnable并实现run()虚函数。然后创建此类的对象,并传递给QthreadPool:start().

class HelloWorldTask : public QRunnable
  {
      void run()
      {
          qDebug() << "Hello world from thread" << QThread::currentThread();
      }
  }

  HelloWorldTask *hello = new HelloWorldTask();
  // QThreadPool takes ownership and deletes 'hello' automatically
  QThreadPool::globalInstance()->start(hello);
    在默认情况下QThreadPool自动删除QRunnable。使用QRunnable::setAutoDelete()去改变自动删除标志。QthreadPool通过在QRunnable::run()调用tryStart(this)来支持多次执行相同的QRunnable。如果自动删除被启动,QRunnable将在最后一个线程退出运行函数时被删除。在启用autoDelete时多次使用相同的QRunnable调用start()会创建一个静态条件不建议这样做。

       超过一定时间未使用的线程将会逾期。默认的逾期时间是30000ms(30s),可以使用setEXpiryTimeout()去修改此时间。如果setEXpiryTimeout()设置的逾期时间为负数,则表示禁用到期机制,即此时线程将会一直存在。

        调用maxThreadCount()去查询要使用的最大线程数。如果需要的话,可以使用setMaxThreadCount()去设置最大线程数的限制。默认的maxThreadCount()是QThread::idealThreadCount(),activeThreadCount()返回当前正在工作的线程数。

      reserveThread()保留一个线程供外部使用,当线程的任务执行完毕后使用releaseThread()可使得此线程可被重用。实际上这些函数可以临时增加或减少活动的线程数,并且在利用QThreadPool去实现不可见的比较耗时的操作时候是非常有用的。

    需要注意的是QThreadPool是一个低级类,需查看Qt并发模块获取更高级的替代方案。

属性:

activeThreadCount:int 
        线程池中活动的线程个数,此值可以返回一个大于maxThreadCount()的值,具体可查看reserveThread()
    int activeThreadCount();///获取此属性
    expiryTimeout:int
            线程池中线程的逾期时间,默认是30s逾期的线程会被销毁。
    int expiryTimeout();///获取此属性
    void setExpiryTimeout(int expiryTimeout);///设置此属性
 maxThreadCount:int
            线程池中线程的个数的最大值。
    默认值是QThread::idealThreadCount()
    int maxThreadCount();//获取最大线程数
   void setMaxThreadCount();//设置最大线程数
 

成员函数:

QThreadPool::QThreadPool(QObject *parent = Q_NULLPTR);//构造函数
QThreadPool::~QThreadPool();//析构函数,此函数阻塞知道所有的runables执行完毕
void QThreadPool::cancel(QRunnable *runnable);///如果runnable未开始运行则移除runnable.对于runnable->autoDelete()返回true则表示此runnable被删除。
void QThreadPool::clear();;///移除所有未运行的runnables.对于runnable->autoDelete()返回true则表示此runnable被删除。
[static] QThreadPool *QThreadPool::globalInstance();///返回全局QthreadPool的实例
void QThreadPool::releaseThread();///释放之前通过reserveThread()保留的线程。调用此函数而不预先保留一个线程会临时增加maxThreadCount(),当线程进入休眠状态等待更多工作时,允许其他线程继续工作。在等待完成后,一定要调用reserveThread(),以便线程池能够正确维护activeThreadCount()线程
void QThreadPool::reserveThread();//忽视activeThreadCount和maxThreadCount地保留一个线程。一旦保留线程的工作处理完成可以调用releaseThread()去允许此线程重用。此函数会增加activeThread,意味着使用此函数可能获取到的activeThreadCount有可能大于maxThreadCount
void QThreadPool::start(QRunnable *runnable, int priority = 0);/*保留一个线程并使用此线程运行runnable,除非此线程使得线程数超过了maxThreadCount().如果此线程使得当前线程数超过了maxThreadCount,runnable会被添加到运行队列中,优先级参数用于控制运行队列的执行顺序。需要注意的是,如果runnable->autoDelete()返回true,线程池拥有此runnable且将会在runnable->run返回后自动删除runnable.如果runnable->autoDelete()返回false,runnable的所有权保留给调用方,注意在调用runnable函数后,更改自动删除会导致未定义的行为*/
bool QThreadPool::tryStart(QRunnable *runnable);/*试图保留一个线程去执行runnable.如果没有线程可用,此函数不做任何事情返回false.否则,runnable会立即使用一个可用线程去运行,并返回true*/
bool QThreadPool::waitForDone(int msecs = -1);/*等待msec毫秒后所有线程退出线程池,并从线程池中删除所有线程。如果所有线程被删除则返回treu.否则返回false.如果msesc=-1.则忽略超时时间,等待到最后一个线程退出,并从线程池中删除所有线程*/
 

QRunnable类使用

//pro文件
Qt += core
//头文件包含   
#include <QRunnable>
介绍:

        QRunnable类是所有runnable对象的基类。QRunnable类是一个接口,用于表示需要执行的任务或代码片。其要执行的任务或代码片添加到重新实现的run()中。可以使用QThreadPool在一个单独的线程中执行任务。如果autoDelete()返回true,则QThreadPool会在QRunnable的run()函数执行完毕后自动删除QRunnable。可使用setAutoDelete()去改变auto-deletion标志。

    QThreadPool可通过在QRunnable的run函数中调用QThread::tryStart(this)来多次执行相同的QRunnable。如果autoDelete使能,则QRunnable将会在最后一个线程退出的时候删除。在启动autoDelet的情况下多次使用相同的QRunnable调用QThreadPool::start()会造成一个竞态不建议这样做。

成员函数:

QRunnable::QRunnable();///构造一个QRunnable,默认Auto-deletion开启
QRunnable::~QRunnable();///QRunnable虚析构函数
bool QRunnable::autoDelete() const;///如果Auto-deletion是开启的则返回true,否则返回false
//如果auto-deletion开启,QThreadPool会在运行完run()后自动删除此runnable。否则runnable的所有权仍然属于应用程序。
[pure virtual] void QRunnable::run();//在子类中实现此纯虚函数
void QRunnable::setAutoDelete(bool autoDelete);///如果autoDelet是true则使能autoDelete否则不使能。autoDelete标志的设置必须在QThreadPool:Start()前完成,否则会出现不确定的结果。
实例:

#include <QApplication>
#include <QThreadPool>
#include <QThread>
#include <QRunnable>
#include <QDebug>
#include <QList>
class MyRun:public QRunnable{
    public:
        void run()
        {
            qDebug()<<"thread start:"<<QThread::currentThreadId();
            QThread::msleep(500);
        }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug()<<"Main:"<<QThread::currentThreadId();
    QThreadPool m;
    QList <MyRun *> tasklist;
    m.setMaxThreadCount(5);///设置线程池的线程最大线程个数是10

    for(int i=0;i<30;i++){
        MyRun *run=new MyRun;
        if(!run->autoDelete()) {
            qDebug()<<"QRunnable's autoDelete default value is not true";
            run->setAutoDelete(true);
        }
       tasklist.append(run);
    }
    for(int i=0;i<3;i++){
        qDebug()<<"m.activeThreadCount():"<<m.activeThreadCount();
        m.start(tasklist.at(i*10+0),i*10+0);
        m.start(tasklist.at(i*10+1),i*10+1);
        m.start(tasklist.at(i*10+2),i*10+2);
        m.start(tasklist.at(i*10+3),i*10+3);
        m.start(tasklist.at(i*10+4),i*10+4);
        m.start(tasklist.at(i*10+5),i*10+5);
        m.start(tasklist.at(i*10+6),i*10+6);
        m.start(tasklist.at(i*10+7),i*10+7);
        m.start(tasklist.at(i*10+8),i*10+8);
        m.start(tasklist.at(i*10+9),i*10+9);
        qDebug()<<"m.activeThreadCount():"<<m.activeThreadCount();
        m.waitForDone();
        qDebug()<<"m.activeThreadCount():"<<m.activeThreadCount();
    }
    return 0;
}
参考:http://www.cnblogs.com/techiel/p/8018379.html
 
--------------------- 
作者:_spite_ 
来源:CSDN 
原文:https://blog.csdn.net/no_pao_spite/article/details/81774008?utm_source=copy 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值