Qt文档阅读笔记-Qt Concurrent介绍及简单使用
目錄
Getting Started
博主栗子
Getting Started
QtConcurrent名稱空間提供了高等級(jí)的API,這些高級(jí)API可以寫多線程的程序,并且可以不使用低等級(jí)線程所要的東西,比如互斥鎖,讀寫鎖,等待條件,信號(hào)量。使用了QtConcurrent的程序通過處理器空閑的核數(shù)自動(dòng)使用線程的數(shù)量。這意味著為來的程序都會(huì)向著多線程發(fā)展。
QtConcurrent包含并行處理風(fēng)格的API函數(shù),包括了共享內(nèi)存系統(tǒng)里MapReduce,FilterReduce的實(shí)現(xiàn),以及在GUI程序中管理異步計(jì)算的類:
Concurrent Map and Map-Reduce
QtConcuurrent::map()對(duì)容器中每一項(xiàng)都使用一個(gè)函數(shù),可以實(shí)現(xiàn)原地修改。
QtConcuurrent::maped()與map()相似,但他會(huì)返回一個(gè)修改了后的新容器。
QtConcuurrent::mappedReduced()與maped()相似,除了修改的結(jié)果會(huì)被減少或壓縮成一個(gè)結(jié)果。
Concurrent Filter and Filter-Reduce
QtConcurrent::filter()當(dāng)過濾函數(shù)被調(diào)用的時(shí)候從容器中移除所有的items。
QtConcuurent::filtered()與filter()相似,除了返回一個(gè)被過濾后的新容器。
QtConcurrent::filteredReduced()與filtered()相似,除了過濾后的結(jié)果會(huì)被減少或壓縮成新的結(jié)果。
Concurrent Run
QtConcurrent::run()在另一個(gè)線程中調(diào)用一個(gè)函數(shù)。
QFuture表示異步計(jì)算的結(jié)果。
QFutureIterator允許迭代器遍歷QFuture獲取數(shù)據(jù)。
QFutureWatcher運(yùn)行使用信號(hào)與槽監(jiān)視一個(gè)QFuture。
QFutureSynchronizer這個(gè)類十分方便的能讓幾個(gè)QFuture進(jìn)行同步。
QtConcurrent支持幾個(gè)STL容器和迭代器,但最好是與Qt的容器一起工作,因?yàn)檫@些容器有隨機(jī)訪問(通過下標(biāo)直接訪問)的迭代器,比如Qlist或QVector。map和filter只支持begin/end這種迭代。
支持STL迭代器的圖表:
QtConcuurrent在迭代大量輕量級(jí)的item的地方,隨機(jī)訪問迭代器在某些情況下更快,因?yàn)樗麄兛梢赃M(jìn)行下標(biāo)訪問容器。除此之外使用隨機(jī)訪問迭代器允許QtConcurrent通過QFuture::progressValue()與QFutureWatcher::progressValueChanged()提供一些進(jìn)度信息。
不能實(shí)現(xiàn)原地修改的函數(shù)比如mapped()和filtered(),他們?cè)谡{(diào)用的時(shí)候要拷貝到容器里面。如果你使用STL的容器去拷貝,拷貝時(shí)會(huì)要開銷一些時(shí)間,這種情況下,Qt建議我們用開始和結(jié)束迭代器進(jìn)行拷貝。
?
博主栗子
來個(gè)關(guān)于QtConcurrent::run簡單栗子:
代碼如下:
widget.h
#ifndef WIDGET_H #define WIDGET_H#include <QWidget>class MyWorker;namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();private:Ui::Widget *ui; };#endif // WIDGET_Hmain.cpp
#include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); }widget.cpp
#include "widget.h" #include "ui_widget.h" #include <QtConcurrent> #include <QDebug>void print(){for(int i=0;i<10000;i++){QThread::msleep(100);qDebug()<<"The value is "<<i;} }Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);QtConcurrent::run(print); }Widget::~Widget() {delete ui; }?
總結(jié)
以上是生活随笔為你收集整理的Qt文档阅读笔记-Qt Concurrent介绍及简单使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt学习笔记-QSS装饰控件
- 下一篇: Qt工作笔记-对qmake的认识【两篇转