日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

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

發布時間:2025/3/15 windows 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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工作笔记-线程池作用之一:限制系统中执行线程的数量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。