天天看點

Qt多線程的三種方法QtConcurrent::run()+QThreadPool

作者:QT教程

一、簡介

QtConcurrent這是一個進階 API,建構于QThreadPool之上,它提供更高層次的函數接口(APIs),使所寫的程式,可根據計算機的CPU核數,自動調整運作的線程數量。通常用于處理大多數通用的并行計算模式。

注意,QtConcurrent是一個命名空間而不是一個類,是以其中的所有函數都是命名空間内的全局函數。

二、使用方法

1. 添加concurrent

從Qt4.4之後,QtConcurrent從core子產品中獨立出來,作為單獨的子產品。

是以先要在.pro中添加 QT += concurrent

QT += core gui concurrent           

2. 使用方法

可以分别将外部函數,lambda表達式,成員函數運作在某一個線程中。

調用外部函數

調用Lambda表達式(同外部函數)

調用成員函數

調用常量成員函數

代碼如下:

//1.調用外部函數func1,并得到傳回值
QFuture<QString> f1 =QtConcurrent::run(func1,QString("aa"));
f1.waitForFinished();
qDebug()<<f1.result();
//2.調用Lambda函數,實際同外部函數方式
QThreadPool pool;
QFuture < void > future = QtConcurrent::run([=](){
qDebug() << __FUNCTION__ << QThread::currentThreadId() << QThread::currentThread();
});
QFuture < void > future2 = QtConcurrent::run([=](){
qDebug() << __FUNCTION__ << QThread::currentThreadId() << QThread::currentThread();
});
//3.調用成員函數
QFuture<void> future3 = QtConcurrent::run(this, &Dialog::memberFun1);
//4.常量成員函數QByteArray::split()
QByteArray bytearray = "hello,world";
QFuture<QList<QByteArray>> future4 = QtConcurrent::run(bytearray, &QByteArray::split, ',');
QList<QByteArray> result = future4.result();
qDebug()<<"result:"<<result;           

運作如下:

func1 "aa" 0xacc QThreadPoolThread(0x3d421d0, name = "Thread (pooled)")
"func1 return"
operator() 0xacc QThreadPoolThread(0x3d421d0, name = "Thread (pooled)")
operator() 0x70ac QThreadPoolThread(0x3d42090, name = "Thread (pooled)")
memberFun1 0x8a88 QThreadPoolThread(0x3d421b0, name = "Thread (pooled)")
result: ("hello", "world")           

三、Qt多線程三種方法總結

Qt多線程的三種方法QtConcurrent::run()+QThreadPool

四、不同開發場景下的考慮

需要線程的生命周期 開發場景 解決方案
單次調用 在其他的線程中運作一個方法,當方法運作結束後退出線程。 1)編寫一個函數,然後利用 QtConcurrent::run()運作它;(2)從QRunnable 派生一個類,并利用全局線程池QThreadPool::globalInstance()->start()來運作它。(3) 從QThread派生一個類, 重載QThread::run() 方法并使用QThread::start()來運作它。
單次調用 一個耗時的操作必須放到另一個線程中運作。在這期間,狀态資訊必須發送到GUI線程中。 使用 QThread,,重載run方法并根據情況發送信号。.使用queued信号/槽連接配接來連接配接信号與GUI線程的槽。
常駐 有一對象位于另一個線程中,将讓其根據不同的請求執行不同的操作。 這意味與工作者線程之間的通信是必須的。 從QObject 派生一個類并實作必要的槽和信号,将對象移到一個具有事件循環的線程中,并通過queued信号/槽連接配接與對象進行通信。

【領QT開發教程學習資料,點選下方連結莬費領取↓↓,先碼住不迷路~】

點選這裡:「連結」

繼續閱讀