欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

QT線程池的使用(QThreadPool類和QRunnable類)

 更新時間:2023年04月25日 10:43:34   作者:lesliefish  
本文主要介紹了QT線程池的使用(QThreadPool類和QRunnable類),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

QThreadPool類

用來管理 QThreads。此類中的所有函數(shù)都是線程安全的.

主要屬性

1、activeThreadCount: 此屬性表示線程池中的活動線程數(shù),通過activeThreadCount() 調用。
2、expiryTimeout: 線程活著的時間。沒有設置expiryTimeout毫秒的線程會自動退出,此類線程將根據(jù)需要重新啟動。默認的expiryTimeout為30000毫秒 (30 秒)。如果expiryTimeout為負, 則新創(chuàng)建的線程將不會過期, 在線程池被銷毀之前, 它們將不會退出。通過expiryTimeout()調用,通setExpiryTimeout(int expiryTimeout)設置 。
3、maxThreadCount : int 表示線程池使用的最大線程數(shù)。
通過maxThreadCount() 調用,通過setMaxThreadCount(int maxThreadCount) 設置
注意:即使maxThreadCount限制為零或為負數(shù), 線程池也至少有1個線程。

主要成員函數(shù)

QThreadPool *QThreadPool::globalInstance()

返回Qt應用程序全局線程池實例。

void reserveThread()

預約一個線程,這個函數(shù)總是會增加活動線程的數(shù)量。這意味著通過使用這個函數(shù),activeThreadCount()可以返回一個大于maxThreadCount()的值。

void releaseThread()

釋放以前通過調用reserveThread()預約的線程。
如果不先預約一個線程,調用這個函數(shù)會臨時增加maxThreadCount()。當線程進入休眠等待時,能夠允許其他線程繼續(xù)。
要記得在完成等待時調用reserveThread(),以便線程池可以正確控制activeThreadCount()。

void QThreadPool :: start(QRunnable * runnable,int priority = 0)

在任務數(shù)量小于maxThreadCount時,為每個runnable任務預約一個線程。超過maxThreadCount時,將任務放入運行隊列中。priority 參數(shù)用來設置線程運行優(yōu)先級。

bool tryStart(QRunnable *runnable)

此方法嘗試預約一個線程來運行runnable。
如果在調用的時候沒有線程可用,那么這個函數(shù)什么都不做,并返回false。否則,將使用一個可用線程立即運行runnable,并返回此函數(shù)true。

void clear()

用于刪除在任務隊列中,還沒有啟動的任務。

bool tryTake(QRunnable *runnable)

如果runnable任務還沒開始運行,那么從隊列中刪除此runable任務,此時函數(shù)返回true;如果runnable任務已經(jīng)運行,返回false。
只用來刪除runnable->autoDelete() == false的runnable任務,否則可能會刪錯任務.

bool waitForDone(int msecs = -1)

等待msecs毫秒, 以便所有線程退出并從線程池中移除所有線程。如果刪除了所有線程, 則返回true ,否則, 它將返回false。默認等待時間為-1,即等待最后一個線程退出。

QRunnable類

QRunnable類是所有runable對象的基類。
QRunnable類是一個接口, 用于表示需要執(zhí)行的任務或代碼段, 具體任務在run() 函數(shù)內部實現(xiàn)。
可以使用QThreadPool在各個獨立的線程中執(zhí)行代碼。如果autoDelete() 返回true (默認值), QThreadPool將自動刪除QRunnable 。使用setAutoDelete() 可更改是否自動刪除。

主要成員函數(shù)

bool autoDelete() const

獲取自動刪除是否啟用,啟用返回true,未啟用返回false。

virtual void run() = 0

純虛函數(shù),在QRunnable子類中實現(xiàn)詳細任務處理邏輯。

void setAutoDelete(bool autoDelete)

如果autoDelete為 true, 則啟用自動刪除。否則自動刪除將被禁用。
如果啟用了自動刪除, QThreadPool將在調用 run () 函數(shù)返回后自動刪除此runable對象。否則, runable對象所有權不屬于線程池,由開發(fā)人員管理。
請注意, 必須先設置此標志,(默認構造函數(shù)已經(jīng)將其設置為true),然后才能調用QThreadPool:: start()。在QThreadPool:: start() 之后調用此函數(shù)將導致不可預測后果。

程序實例

任務類(runable類)頭文件

#ifndef PRINTTASK_H
#define PRINTTASK_H

#include <QObject>
#include <QRunnable>

class PrintTask : public QObject, public QRunnable
{
? ? Q_OBJECT

public:
? ? PrintTask();
? ? ~PrintTask();
protected:
? ? void run();

signals:
? ? //注意!要使用信號,采用QObejct 和 QRunnable多繼承,記得QObject要放在前面
? ? void mySignal();
};

#endif // PRINTTASK_H

任務類(runable類)實現(xiàn)文件

#include "printtask.h"
#include <QThread>
#include <iostream>
using std::cout;
using std::endl;

PrintTask::PrintTask()
{
}

PrintTask::~PrintTask()
{

}

//線程真正執(zhí)行的內容
void PrintTask::run()
{
? ? cout << "PrintTask run 被調用,調用線程ID為:" << QThread::currentThread() << endl;
}

主函數(shù)文件:

#include <QCoreApplication>
#include <QThreadPool>
#include "printtask.h"

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

? ? //設置最大線程數(shù)為3的一個線程池
? ? QThreadPool pool;
? ? pool.setMaxThreadCount(3);

? ? for(int i = 0; i < 20; i++)
? ? {
? ? ? ? pool.start(new PrintTask());
? ? }

? ? return a.exec();
}

輸出:

PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:004F3868
PrintTask run 被調用,調用線程ID為:004F3848
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:004F3848
PrintTask run 被調用,調用線程ID為:004F3868
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:004F3848
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:004F3868
PrintTask run 被調用,調用線程ID為:004F3848
PrintTask run 被調用,調用線程ID為:00533678
PrintTask run 被調用,調用線程ID為:004F3868
PrintTask run 被調用,調用線程ID為:004F3848
PrintTask run 被調用,調用線程ID為:004F3868
...

分析打印結果發(fā)現(xiàn):20個任務,只有3個線程(線程ID分別為00533678、004F3848,004F3868)去執(zhí)行,符合期望。

到此這篇關于QT線程池的使用(QThreadPool類和QRunnable類)的文章就介紹到這了,更多相關QT線程池內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言詳解如何實現(xiàn)帶頭雙向循環(huán)鏈表

    C語言詳解如何實現(xiàn)帶頭雙向循環(huán)鏈表

    帶頭雙向循環(huán)鏈表:結構最復雜,一般用在單獨存儲數(shù)據(jù)。實際中使用的鏈表數(shù)據(jù)結構,都是帶頭雙向循環(huán)鏈表。另外這個結構雖然結構復雜,但是使用代碼實現(xiàn)以后會發(fā)現(xiàn)結構會帶來很多優(yōu)勢,實現(xiàn)反而簡單
    2022-04-04
  • C語言超全面define預處理指令的使用說明

    C語言超全面define預處理指令的使用說明

    C語言里可以用#define定義一個標識符來表示一個常量。特點是:定義的標識符不占內存,只是一個臨時的符號,預編譯后這個符號就不存在了,也不做類型定義。預編譯又叫預處理
    2022-04-04
  • C語言數(shù)據(jù)結構圖的創(chuàng)建與遍歷實驗示例

    C語言數(shù)據(jù)結構圖的創(chuàng)建與遍歷實驗示例

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結構圖的創(chuàng)建與遍歷實驗示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • C++11新特性之變長參數(shù)模板詳解

    C++11新特性之變長參數(shù)模板詳解

    本文主要介紹了C++11變長參數(shù)模板,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • 新舊MFC版本實現(xiàn)CEdit透明的2種方法的實例代碼

    新舊MFC版本實現(xiàn)CEdit透明的2種方法的實例代碼

    新舊MFC版本實現(xiàn)CEdit透明的2種方法的實例代碼,需要的朋友可以參考一下
    2013-03-03
  • 關于C語言指針賦值的問題詳解

    關于C語言指針賦值的問題詳解

    本篇文章是對C語言指針賦值的問題進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實現(xiàn)迷宮生成與解決

    C++實現(xiàn)迷宮生成與解決

    這篇文章主要為大家詳細介紹了C++實現(xiàn)迷宮生成與解決,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 詳解C++何時需要拷貝構造函數(shù)

    詳解C++何時需要拷貝構造函數(shù)

    拷貝構造函數(shù)是一個特殊的構造函數(shù),用于創(chuàng)建一個新對象,該對象與另一個同類對象具有相同的屬性和值,在 C++ 中,拷貝構造函數(shù)通常采用另一個同類對象作為參數(shù),并使用該對象初始化新對象,本文給大家講講何時需要拷貝函數(shù),需要的朋友可以參考下
    2023-09-09
  • C++內存管理面經(jīng)

    C++內存管理面經(jīng)

    這篇文章主要介紹了C++的內存分配方式以及介紹了下棧和堆的區(qū)別,感興趣的小伙伴可以參考閱讀本文
    2023-03-03
  • C++?ROS與boost:bind()使用詳解

    C++?ROS與boost:bind()使用詳解

    boost::bind是標準庫函數(shù)std::bind1st和std::bind2nd的一種泛化形式,其可以支持函數(shù)對象、函數(shù)、函數(shù)指針、成員函數(shù)指針,并且綁定任意參數(shù)到某個指定值上或者將輸入?yún)?shù)傳入任意位置,本文重點介紹下C++?ROS與boost:bind(),感興趣的朋友跟隨小編一起看看吧
    2023-01-01

最新評論