【QT】QtConcurrent::run()+QThreadPool實現多線程


往期鏈接:

在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM