QtConcurrent系列之run函式建立多執行緒
阿新 • • 發佈:2018-12-15
在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();