1. 程式人生 > >QtConcurrent系列之run函式建立多執行緒

QtConcurrent系列之run函式建立多執行緒

        在Qt多執行緒程式設計中,我們一般使用QThread,QRunnable等類來實現多執行緒。除此之外,QT還提供了一個更高階的實現多執行緒的方式,那就是QtConcurrent框架,QtConcurrent框架中提供了許多高階的,效能更好的多執行緒API函式,這些函式非常方便使用。本文重點介紹QtConcurrent:run函式,使用該函式可以方便的建立一個多執行緒。 使用QTConcurrent之前,需要在Pro工程檔案中新增 Qt += concurrent,並且在標頭檔案加上#include ,QtConcurrent:run函式有兩個過載,分別是:

QFuture<T> QtConcurrent::run(Function function, ...);
QFuture<T> QtConcurrent::run(QThreadPool *pool, Function function, ...);

         第一個函式等同於QtConcurrent::run(QThreadPool::globalInstance(), function, …);使用的時候只需往該函式傳遞一個函式物件即可,比如

void myFunc(int max)
{
    for(auto i = 0;i< 10;i++){
        qDebug() << "this is NO." << i;
        QThread::sleep(1);
    }
}

#include <QCoreApplication>
#include <QtCore/QtCore>
#include <QtConcurrent>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
	QtConcurrent::run(myFunc);
	
	return a.exec();
}

        也可以使用自己定義的QThreadPool物件並傳遞給run函式。

#include <QCoreApplication>
#include <QtCore/QtCore>
#include <QtConcurrent>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    QThreadPool pool;
    QtConcurrent::run(&pool,myFunc);
	
    return a.exec();
}

      QtConcurrent:run的返回值是QFurutre,是一個監控執行緒並非同步獲取執行緒結果的類,這裡暫不介紹了。       我們也可以向QtConcurrent:run裡面的執行緒函式傳遞引數。

void myFunc(int max)
{

    for(auto i = 0;i< max;i++)
    {
        qDebug() << "this is NO." << i;
        QThread::sleep(1);
    }
}

#include <QtCore/QtCore>
#include <QtConcurrent>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QtConcurrent::run(myFunc,20);
	
    return a.exec();
}

      另外,QtConcurrent:run函式也可以接受成員函式,但是要求傳遞的變數需要是常量引用或者指標,傳遞的函式是常量成員函式時則傳遞常量引用,函式是非常量成員函式時則傳遞指標。比如:

QByteArray bytearray = "hello world";
  QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split, ',');
  ...
  QList<QByteArray> result = future.result();