往期鏈接:
- 《QThread原始碼淺析》
- 《子類化QThread實作多執行緒》
- 《子類化QObject+moveToThread實作多執行緒》
- 《繼承QRunnable+QThreadPool實作多執行緒》
- 本文章實體的原始碼地址:https://gitee.com/CogenCG/QThreadExample.git
在QT開發的場景中,個人覺得此方法使用的也比較少,所以本文只作一個簡單使用的介紹,QtConcurrent 是命名空間 (namespace),它提供了高層次的函式介面 (APIs),使所寫程式,可根據計算機的 CPU 核數,自動調整運行的執行緒數目,本文以 Qt 中的 QtConcurrent::run() 函式為例,介紹如何將函式運行在單獨的執行緒中,
(1)使用 QtConcurrent 模塊,需要在 .pro 中添加:
QT += concurrent
(2)將一個普通函式運行在單獨執行緒:
#include <QApplication>
#include <QDebug>
#include <QThread>
#include <QtConcurrent>
void fun1(){
qDebug()<<__FUNCTION__<<QThread::currentThread();
}
void fun2(QString str1, QString str2){
qDebug()<<__FUNCTION__<<str1+str2<<QThread::currentThread();
}
int fun3(int i, int j){
qDebug()<<__FUNCTION__<<QThread::currentThread();
return i+j;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
qDebug()<<__FUNCTION__<<QThread::currentThread();
//無引數的普通函式
QFuture<void> fut1 = QtConcurrent::run(fun1);
//有引數的普通函式
QFuture<void> fut2 = QtConcurrent::run(fun2, QString("Thread"),QString(" 2"));
//獲取普通函式的回傳值
int i=1, j=2;
QFuture<int> fut3 = QtConcurrent::run(fun3, i, j);
qDebug()<<"ret:"<<fut3.result();
//以上的例子,如果要為其指定執行緒池,可以將執行緒池的指標作為第一個引數傳遞進去
QThreadPool pool;
QFuture<void> fut4 = QtConcurrent::run(&pool, fun1);
fut1.waitForFinished();
fut2.waitForFinished();
fut3.waitForFinished();
fut4.waitForFinished();
return a.exec();
}
輸出結果:
qMain QThread(0xf380590)
fun2 "Thread 2" QThread(0x1ca7c758, name = "Thread (pooled)")
fun1 QThread(0x1ca7c6d8, name = "Thread (pooled)")
fun3 QThread(0x1ca7c5b8, name = "Thread (pooled)")
ret: 3
fun1 QThread(0x1ca7c438, name = "Thread (pooled)")
(3)將類中的成員函式單獨運行在執行緒中:
將類中的成員函式運行在某一個執行緒中,可將指向該類實體的參考或指標作為 QtConcurrent::run 的第一個引數傳遞進去,常量成員函式一般傳遞常量參考 (const reference),而非常量成員函式一般傳遞指標 (pointer),
- 常量成員函式
在一個單獨的執行緒中,呼叫 QByteArray 的常量成員函式 split(),傳遞給 run() 函式的引數是 bytearray
//常量成員函式QByteArray::split()
QByteArray bytearray = "hello,world";
QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split, ',');
QList<QByteArray> result = future.result();
qDebug()<<"result:"<<result;
- 非常量成員函式
在一個單獨的執行緒中,呼叫 QImage 的非常量成員函式 invertPixels(),傳遞給 run() 函式的引數是 &image
QImage image = ...;
QFuture<void> future = QtConcurrent::run(&image, &QImage::invertPixels, QImage::InvertRgba);
...
future.waitForFinished(); // At this point, the pixels in 'image' have been inverted
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/209823.html
標籤:C++
上一篇:Linux安裝Nginx步驟
