一、簡介
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多線程三種方法總結
四、不同開發場景下的考慮
需要線程的生命周期 | 開發場景 | 解決方案 |
單次調用 | 在其他的線程中運作一個方法,當方法運作結束後退出線程。 | 1)編寫一個函數,然後利用 QtConcurrent::run()運作它;(2)從QRunnable 派生一個類,并利用全局線程池QThreadPool::globalInstance()->start()來運作它。(3) 從QThread派生一個類, 重載QThread::run() 方法并使用QThread::start()來運作它。 |
單次調用 | 一個耗時的操作必須放到另一個線程中運作。在這期間,狀态資訊必須發送到GUI線程中。 | 使用 QThread,,重載run方法并根據情況發送信号。.使用queued信号/槽連接配接來連接配接信号與GUI線程的槽。 |
常駐 | 有一對象位于另一個線程中,将讓其根據不同的請求執行不同的操作。 | 這意味與工作者線程之間的通信是必須的。 從QObject 派生一個類并實作必要的槽和信号,将對象移到一個具有事件循環的線程中,并通過queued信号/槽連接配接與對象進行通信。 |
【領QT開發教程學習資料,點選下方連結莬費領取↓↓,先碼住不迷路~】
點選這裡:「連結」