Qt工作笔记-线程池作用之一:限制系统中执行线程的数量
生活随笔
收集整理的這篇文章主要介紹了
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_OBJECTpublic: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"));} }?
總結
以上是生活随笔為你收集整理的Qt工作笔记-线程池作用之一:限制系统中执行线程的数量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++工作笔记-WM_KEYFIRST和
- 下一篇: 系统架构师学习笔记-数据通信与计算机网络