1. 程式人生 > >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_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"));
    }
}

相關推薦

Qt工作筆記-執行作用之一限制系統執行執行數量

一、執行緒池的作用: 執行緒池作用就是限制系統中執行執行緒的數量。 根據系統的環境情況,可以自動或手動設定執行緒數量,達到執行的最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高。用執行緒池控制執行

Linux ps命令檢視系統正在執行的程序

ps 是用來靜態地檢視系統中正在執行的程序的命令。 “ps aux"可以檢視系統中所有的程序;(使用BS作業系統格式。但是這個選項不能加入”-"。) "ps -le"可以檢視系統中所有的程序,而且還能看到程序的父程序的PID和程序優先順序;( 使用Linux標準命令格式) "ps -l"

【程式設計筆記執行實現原始碼(從POCO剝離出來)

原始碼下載:https://download.csdn.net/download/fzuim/10625204 CThreadPool類 /***************************************************************

執行 技術點 目錄 1. 執行作用 提升效能 1 2. 使用流程 1 3. 執行執行的監控 jvisual 1 4. 執行常用方法 2 5. 執行相關概念 2 5.1. 佇列

 池與執行緒池 技術點   目錄 1. 執行緒池作用:  提升效能 1 2. 使用流程 1 3. 執行緒與執行緒池的監控  jvisual 1 4. 執行緒常用方法 2 5. 執行緒池相關概念 2 5.1. 佇列 &n

moquette改造筆記(三)優化BrokerInterceptor 執行

發現問題 在io.moquette.spi.impl.BrokerInterceptor的建構函式中,新建了一個執行緒池,程式碼如下: private BrokerInterceptor(int poolSize, List<InterceptHandler&

執行系列一執行作用及Executors方法講解

執行緒池的作用:      執行緒池作用就是限制系統中執行執行緒的數量。      根據系統的環境情況,可以自動或手動設定執行緒數量,達到執行的最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高。用執行緒池控制執行緒數量,其他執行緒 排隊等候。一個任務執行完畢,再

c++11 執行系列之一 所需要的join_threads

class join_threads { std::vector<std::thread> &threads; public: explicit join_threads(std::vector<std::thread> &thre

執行併發藝術之一什麼是執行

執行緒: 定義不用多說,個人理解就是一條生產線(thread) 生產線可以有多條,可以幾乎是同時進行生產,但是能源(cpu資源是有限的,可以通過時間片來輪轉獲得cpu使用權), 生產線有些時候並不需要能源(這裡比喻為能源可能欠妥,姑且稱之為 核能吧,用之不竭的能源),比如需要等待原材

Linux|Qt工作筆記-linux系統下安裝qt4.5.3版本的詳細步驟

原文地址如下: https://blog.csdn.net/AmyAndTommy/article/details/81901005     第一步:下載qt-all-opensource-src-4.5.3.tar  (地址:http://downlo

Java多執行-執行ThreadPoolExecutor構造方法和規則 Java多執行-執行ThreadPoolExecutor構造方法和規則

Java多執行緒-執行緒池ThreadPoolExecutor構造方法和規則 2017年05月03日 17:15:37 閱讀數:40542 為什麼用執行緒池 部落格地址 http://blog.csdn.ne

Qt工作筆記-Qt文件筆記-QPainter::drawText寫文字並且居中

官方解析 畫給定的text並且從指定的position。 這個函式不能處理換行符號(\n),不能將文字分割成多行,也不能分行展示。使用QPainer::drawText()的過載函式可以繪製一個多邊形

Qt文件閱讀筆記-Qt工作筆記QProcess::finished的解析與例項

目錄 官方解析 博主例子 官方解析 void QProcess::finished(int exitCode, QProcess::ExitStatus exitStatus) 這個訊號是當process完成時候才發射的。exitCode是程序退出的程式碼(

Qt工作筆記-undefined reference to `vtable for MyObject'及對moc檔案的進一步理解

原始碼如下: main.cpp #include <QApplication> #include <QObject> #include <QTextCodec> class MyObject:public QObject{ Q

Qt工作筆記-Qt文件閱讀筆記-QXmlStreamReader::qualifiedName()如何解析帶限制符的XML

目錄 官方解析 博主例子 官方解析 QXmlStreamReader::qualifiedName() 返回StartElement或EndElement的限制名; 限制名是XML資料中元素的原

C/C++|Qt工作筆記-4種方法判斷當前物件(類)名或標識(繼承發,typeid法,元物件className()法,Q_CLASSINFO法)

回想起3個月前,剛剛參加工作也做過類似的筆記,但只有2種方法,估計剛畢業沒有什麼墨水,經過3個月時間又多了2種方法: 這些方法都可用於RTTI 第一個方法是繼承發(C++中很推薦用這個,感覺用這個結構會很清晰): 執行截圖如下: 原始碼如下: #

Qt工作筆記-QSort的基本使用

如下面這個程式碼: #include <QCoreApplication> #include <QVector> #include <ctime> #include

執行運用例項——一次錯誤的多執行程式設計以及修復過程

寫在前面的話  寫下這篇文章只為了回顧之前在實際工作中犯的一個極其二逼的錯誤,用我的經歷來提示後來者,諸位程式大神,大牛,小牛們看到此文笑笑即可,輕拍輕拍。。。 1 背景 有這麼一個需求,我們的系統(後面簡稱:A系統)需要在後臺執行一個報表匯出任務,在這個任務的執行過程中需要通過CORBA呼

執行之建立執行的方式之一實現Callable介面(三)

對於多執行緒,大家並不陌生,對於如何建立執行緒也是輕車熟路,對於使用new thread和實現runable介面的方式,不再多說。這篇博文我們介紹第三種:實現Callable介面。 Callable介面 介面定義: @FunctionalInterface

深入理解Java執行原理分析與使用(尤其當執行佇列滿了之後事項)

在這裡借花獻佛了,那別人的東西學一學了。在我們的開發中“池”的概念並不罕見,有資料庫連線池、執行緒池、物件池、常量池等等。下面我們主要針對執行緒池來一步一步揭開執行緒池的面紗。使用執行緒池的好處1、降低資源消耗可以重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。2、提高響應速度當任務到達時,任務可以不需

Java 多執行ThreadPoolExecutor解析及Executors類提供的靜態方法來建立執行

上面的程式碼可能看起來不是那麼容易理解,下面我們一句一句解釋:   首先,判斷提交的任務command是否為null,若是null,則丟擲空指標異常;   接著是這句,這句要好好理解一下: if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(c