Qt文档阅读笔记-QThreadPool的解释及使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq78442761/article/details/82178516

目录

Detailed Description

博主栗子

关于全局线程池使用以及是否自动销毁

关于最大线程的运行栗子


Detailed Description

QThreadPool类用于管理QThreads的集合。

QThreadPool管理以及重复利用每一个线程对象,来帮助减少创建线程时带来的系统开销。每一个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。但可以通过使用QRunable::setAutoDelete()去改变自动删除这个功能。

QThreadPool支持执行相同的QRunnable类,这种骚操作可以在QRunnable::run()中调用tryStart(this)。当自动删除被激活的时候,QRunnable将在最后一个线程运行函数调用并且结束后,被调用(自动删除)。当autoDelete被激活的时候用一个相同的QRunnable调用多次start(),会创造线程的竞争条件,官方不推荐这么做。

在一定时间内没有使用的线程将会死亡,这个默认死亡的时间是30s。但可以通过使用setExpiryTimeout()函数来改变这个到期的值。通过设置一个与时间之前的值(比如现在是9点半,设置成9点)那么这个到期的机制将会被终止。

调用maxThreadCount()能查询到可以使用的最大线程的个数,想改变他的话可以通过调用setMaxThreadCount()进行设置。默认的maxThreadCount()的数量是QThread::idealThreadCount()。activeThreaCount()返回目前正在工作的线程的数量。

reserveThread()函数保留了一个线程用于线程池外部使用。通过调用releaseThread()进行使用,这个线程是不会到期的,可以重复使用。可以通过使用这些函数去临时的增加或减少活动的线程的数量,并且还不对系统的时间开销还不高。

【注意:QThreadPool是低级的线程管理类,Qt Concurrent module是高级管理类,他是QThreadPool的代替选择】

博主栗子

关于全局线程池使用以及是否自动销毁

程序运行截图如下:

源码如下:

worker.h

#ifndef WORKER_H
#define WORKER_H

#include <QRunnable>

class Worker : public QRunnable
{
public:
    explicit Worker();
    ~Worker();
    void run();
};

#endif // WORKER_H

worker.cpp

#include "worker.h"
#include <QDebug>
#include <QThread>

Worker::Worker()
{

}

Worker::~Worker()
{
    qDebug()<<"go home, dog bye";
}

void Worker::run()
{
    qDebug()<<"Hello world from thread "<<QThread::currentThreadId();
}

mainc.pp

#include "worker.h"
#include <QApplication>
#include <QThreadPool>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Worker *worker=new Worker;
    QThreadPool::globalInstance()->start(worker);

    return a.exec();
}

可以看到他自动调用了析构函数,他在内部对他进行delete(对于C++程序员来说,这有点爽啊)

关于最大线程的运行栗子

运行截图如下:

代码如下:

worker.h

#ifndef WORKER_H
#define WORKER_H

#include <QRunnable>

class Worker : public QRunnable
{
public:
    explicit Worker();
    ~Worker();
    void run();
};

#endif // WORKER_H

worker.cpp

#include "worker.h"
#include <QDebug>
#include <QThread>

Worker::Worker()
{
    //this->setAutoDelete(false);
}

Worker::~Worker()
{
    qDebug()<<"go home, dog bye";
}

void Worker::run()
{
    QThread::msleep(1000);
    qDebug()<<"Hello world from thread "<<QThread::currentThreadId();
}

main.cpp

#include "worker.h"
#include <QApplication>
#include <QThreadPool>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    Worker *worker[100];
    for(int i=0;i<100;i++){
        worker[i]=new Worker;
    }
    QThreadPool::globalInstance()->setMaxThreadCount(2);

    for(int i=0;i<100;i++){
        QThreadPool::globalInstance()->start(worker[i]);
    }
    return a.exec();
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/82178516