Qt工作笔记-线程池作用之一:限制系统中执行线程的数量

一、线程池的作用:
线程池作用就是限制系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
二、为什么要用线程池:
1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

程序运行截图如下:

代码如下:

mytask.h

#ifndef MYTASK_H
#define MYTASK_H

#include <QRunnable>
class QListWidget;

class MyTask : public QRunnable
{
public:
    MyTask(QListWidget *listWidget);
    ~MyTask();

    int Create();
    void Destroy();

private:
    void run();
    QListWidget *m_listWidget;
};

#endif // MYTASK_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
class MyTask;
class QThreadPool;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    
public slots:
    void btnClicked();

private:
    Ui::Widget *ui;
    MyTask *m_myTask[5];
    QThreadPool *m_pThreadPool;
};

#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

mytask.cpp

#include "mytask.h"
#include <QDebug>
#include <QTime>
#include <QThread>
#include <QListWidget>
#include <QListWidgetItem>

MyTask::MyTask(QListWidget *listWidget)
{
    m_listWidget=listWidget;
    QListWidgetItem *item=new QListWidgetItem;
    item->setTextColor(Qt::green);
    item->setText("MyTask created: this is 0x"+QString::number((unsigned int)this,16));
    m_listWidget->insertItem(0,item);
}

MyTask::~MyTask()
{
    QListWidgetItem *item=new QListWidgetItem;
    item->setTextColor(Qt::red);
    item->setText("MyTask::~MyTask() called! this address is 0x"+QString::number((unsigned int)this,16));
    m_listWidget->insertItem(0,item);
}

void MyTask::run()
{
    QListWidgetItem *item1=new QListWidgetItem;
    item1->setText("threadID:"+QString::number((unsigned int)QThread::currentThreadId(),16)+"    this:"+QString::number((unsigned int)this,16));
    m_listWidget->insertItem(0,item1);
    for(int i=0;i<10;i++){
        QListWidgetItem *item=new QListWidgetItem;
        item->setText("threadID:"+QString::number((unsigned int)QThread::currentThreadId())+" i:"+QString::number(i));
        m_listWidget->insertItem(0,item);

        qDebug()<<"threadID:"<<QThread::currentThreadId()
               <<" i:"<<i<<" time:"<<QTime::currentTime().toString("HH:mm:ss");
        QThread::sleep(1);
    }
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "mytask.h"
#include <QThreadPool>
#include <QListWidgetItem>
#include <QTime>
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    for(int i=0;i<5;i++){
        m_myTask[i]=new MyTask(ui->listWidget);
    }
    connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(btnClicked()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::btnClicked()
{
    m_pThreadPool=QThreadPool::globalInstance();
    if(m_pThreadPool){
        m_pThreadPool->setMaxThreadCount(3);
        m_pThreadPool->setExpiryTimeout(-1);


        for(int i=0;i<5;i++){
            m_pThreadPool->start(m_myTask[i]);
        }
        m_pThreadPool->waitForDone();
        QListWidgetItem *item1=new QListWidgetItem;
        item1->setTextColor(Qt::blue);
        item1->setText("m_pThreadPool->waitForDone()   time:"+QTime::currentTime().toString("HH:mm:ss"));
        ui->listWidget->insertItem(0,item1);


        m_pThreadPool->clear();
        QListWidgetItem *item2=new QListWidgetItem;
        item2->setTextColor(Qt::red);
        item2->setText("m_pThreadPool->clear()   time:"+QTime::currentTime().toString("HH:mm:ss"));
    }
}

猜你喜欢

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