1. 程式人生 > >Qt 之 Concurrent Run

Qt 之 Concurrent Run

簡述

QtConcurrent::run() 函式在一個單獨的執行緒中執行一個函式, 函式的返回值通過 QFuture API 提供。

|

在單獨的執行緒中執行函式

要在另一個執行緒中執行函式,使用 QtConcurrent::run():

extern void aFunction();
QFuture<void> future = QtConcurrent::run(aFunction);

這將在從預設的 QThreadPool 獲取的單獨的執行緒中執行 aFunction 。可以使用 QFuture 和 QFutureWatcher 監控函式的狀態。

要使用專用的執行緒池,可以傳遞 QThreadPool 作為第一個引數:

extern void aFunction();
QThreadPool pool;
QFuture<void> future = QtConcurrent::run(&pool, aFunction);

將引數傳遞給函式

將引數傳遞給函式,是通過將它們新增到 QtConcurrent::run() 直接呼叫在函式名之後。例如:

extern void aFunctionWithArguments(int arg1, double arg2, const QString &string);

int integer = ...;
double floatingPoint = ...
; QString string = ...; QFuture<void> future = QtConcurrent::run(aFunctionWithArguments, integer, floatingPoint, string);

每個引數的副本在呼叫 QtConcurrent::run() 的時候產生,當函式開始執行時,這些值被傳遞給執行緒。呼叫 QtConcurrent::run() 後對引數所做的更改對執行緒不可見。

從函式返回值

該函式的任何返回值都可以通過 QFuture 可見:

extern QString functionReturningAString();
QFuture<QString> future = QtConcurrent::run(functionReturningAString);
...
QString result = future.result();

正如上面記錄的,傳遞引數是這樣的:

extern QString someFunction(const QByteArray &input);

QByteArray bytearray = ...;

QFuture<QString> future = QtConcurrent::run(someFunction, bytearray);
...
QString result = future.result();

注意: QFuture::result() 函式阻塞並等待結果可用。當函式執行完成並且結果可用時,使用 QFutureWatcher 獲取通知。

附加 API 功能

使用成員函式

QtConcurrent::run() 也接受指向成員函式的指標,第一個引數必須是 const 引用或指向類的例項的指標。在呼叫 const 成員函式時,const 引用的傳遞是很有用的,傳遞指標對於呼叫修改例項的非 const 成員函式非常有用。

例如,在單獨的執行緒中呼叫 QByteArray::split()(一個 const 成員函式)是這樣做的:

// 在一個單獨的執行緒中呼叫 QList<QByteArray> QByteArray::split(char sep) const
QByteArray bytearray = "hello world";
QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split, ',');
...
QList<QByteArray> result = future.result();

呼叫非 const 成員函式是這樣完成的:

// 在一個單獨的執行緒中呼叫 void QImage::invertPixels(InvertMode mode) 
QImage image = ...;
QFuture<void> future = QtConcurrent::run(&image, &QImage::invertPixels, QImage::InvertRgba);
...
future.waitForFinished();
// 此時,image 中的畫素已經被反轉

使用繫結函式引數

在呼叫時,可以使用 std::bind() 將一些引數繫結到函式。如果 C++11 支援不可用,boost::bind()std::tr1::bind() 是合適的替代品。

有許多繫結的原因:

  • 呼叫需要超過 5 個引數的函式
  • 簡化使用常量引數呼叫函式
  • 更改引數的順序

呼叫繫結函式是這樣做的:

void someFunction(int arg1, double arg2);
QFuture<void> future = QtConcurrent::run(std::bind(someFunction, 1, 2.0));
...

有關如何使用繫結 API 的詳細資訊,請參閱相關函式的文件。

更多參考

相關推薦

Qt Concurrent Run

簡述 QtConcurrent::run() 函式在一個單獨的執行緒中執行一個函式, 函式的返回值通過 QFuture API 提供。 | 在單獨的執行緒中執行函式 要在另一個執行緒中執行函式,使用 QtConcurrent::run():

Qt Concurrent Map 和 Map-Reduce

簡述 QtConcurrent::map()、QtConcurrent::mapped() 和 QtConcurrent::mappedReduced() 函式對一個序列中(例如:QList、QVector)的專案並行地進行計算。QtConcurrent::m

QtConcurrent框架

簡述 QtConcurrent 名稱空間提供了高階 API,使得可以在不使用低階執行緒原語(例如:互斥、讀寫鎖、等待條件或訊號量)的情況下編寫多執行緒程式,使用 QtConcurrent 編寫的程式根據可用的處理器核心數自動調整所使用的執行緒數。這意味著,當在未來部署多核系統時,現在編寫的應用程式將繼續

Qt Concurrent 框架

簡述 QtConcurrent 名稱空間提供了高階 API,使得可以在不使用低階執行緒原語(例如:互斥、讀寫鎖、等待條件或訊號量)的情況下編寫多執行緒程式,使用 QtConcurrent 編寫的程式根據可用的處理器核心數自動調整所使用的執行緒數。這意味著,當在

Qt concurrent run()函式使用

QFuture<T>run(constClass*object,T(Class::*fn)(Param1,Param2,Param3,Param4,Param5)const,constArg1 &arg1,constArg2 &arg2,cons

Qt自定義搜索框——QLineEdit裏增加一個Layout,還不影響正常輸入文字(好像是一種比較通吃的方法)

too 步驟 set box 文本 csdn sub void 鼠標 簡述 關於搜索框,大家都經常接觸。例如:瀏覽器搜索、Windows資源管理器搜索等。 當然,這些對於Qt實現來說毫無壓力,只要思路清晰,分分鐘搞定。 方案一:調用QLineEdit現

Qt入門實踐】Qt哲學家問題(linux 多線程)

avi .cpp private 1=1 endif debug 問題 tel pub 轉載請註明出處:http://blog.csdn.net/feng1790291543 linux多線程實現哲學家問題,依據哲學家吃飯、拿筷子、放下筷子...... 首先,主

Qt qwt 和 qwtpolar

shu fix style file ins nmake con http com 1 qwt 1.1 下載  qwt-6.1.3 版本下載地址: https://sourceforge.net/projects/qwt/files/qwt/ 1.2 解壓

Qtzip壓縮/解壓縮(QuaZIP)

com spm c++ ews pen 更多 pri cat markdown 摘要: 簡述 QuaZIP是使用Qt/C++對ZLIB進行簡單封裝的用於壓縮及解壓縮ZIP的開源庫。適用於多種平臺,利用它可以很方便的將單個或多個文件打包為zip文件,且打包後的zip文件可

QT設計部件背景色

ack 主界面 disable tracking avi blue line popu 基本 一、使用QT樣式表設計部件外觀 樣式表使用文本描寫敘述,能夠使用QApplication::setStyleSheet()函數將其設置到整個應用程序上。也能夠使用QWid

Qt 重復連接信號槽

style ref 重復 rtk doc svg cap http wls 059E2聘853F鉸http://t.docin.com/cufx6020 謔H戳桃桓51A判8w0芯http://t.docin.com/roj681 橙B3em刺灘姑0競eu奧0http:

QT初體驗1:如何學習QT個人淺見,以及如何讀取文本文件,在調試信息中輸出。

沒有 c++教程 最簡 將不 ror 聽說 講解 知識點 括號 2017年11月初,隨著工作崗位的調動,我轉到了研發崗,開始了漫漫程序員的成長之路。首先介紹下個人知識儲備,大一學習過C語言,沒有工程經驗,所學是為了期末考試+2級考試,考完在大學+碩士期間沒有用到編程。 來到

QTQSignalMapper(可以理解為轉發器,多個按鈕綁定到一個Edit上,且能分辨。每個單獨連接的話,反而麻煩)

this 不同的 lan each b2c etc gpo 知識點 span QT之QSignalMapper QT之QSignalMapper 簡述 效果圖 上代碼 相關知識點文章 結尾 簡述 QSign

QT圓形頭像(使用PNG的Mask達到的效果)

led asp mage gravity details fill text sca ima 廢話不多說!直接上代碼。 我們在很多UI設計應用中,需要用到自定義形狀頭像,在這裏,我對圓形頭像的設計做簡單的闡述,其它形狀頭像可參考本文做相應的更改即可。如下圖所

QtQEvent(所有事件的翻譯)

sin ini 隊列 方便 erp 拖放 sdn 所有 area QEvent 類是所有事件類的基類,事件對象包含事件參數。 Qt 的主事件循環(QCoreApplication::exec())從事件隊列中獲取本地窗口系統事件,將它們轉化為 QEvents,然後將轉換後

QtQLabel

不同顏色 map() int ble code 關於 sheet 畫的 fun 簡述 QLabel提供了一個文本或圖像的顯示,沒有提供用戶交互功能。 一個QLab

QT窗口部件及窗口類型

QT 窗口組件 窗口類型 今天我們來繼續學習QT的相關知識,本文的內容是介紹QT的窗口部件及窗口類型。 先說下窗口組件,圖形用戶界面由不同的窗口和窗口組件構成,一般是在<QtGui>中包含,對應Qt中的GUI模塊;Qt以組件對象的方式構建圖形用戶界面;組件的類型分為兩種:1、容器類(父

QT坐標系統

QT 坐標系統 GUI操作系統都有其特定的坐標系統;我們本節要在坐標系統中進行窗口和部件的定位,定位類型分為3種: 1、頂級窗口部件的定位 2、窗口內部件的定位 3、窗口部件的大小設置 Qt 使用同一的坐標系統定位窗口部件的位置和大小;Qt 部件類提供成員函數在坐標系統中進行定

QT創建計算器

QT 計算器 界面 上篇博客說我們要創建一個計算器,那麽下面我們來創建一個計算器的界面,這節只是簡單的開發一個計算器的界面。實現的是一個文本框只能顯示,不能輸入的,界面大小固定的計算器。那麽在開發之前,我們的的QT知識還有所欠缺,對於文本框的顯示,我們沒有相關的知識,我們就先學習下 QLineEd

QT計算器代碼重構

QT 代碼重構 首先我們來講講為什麽要進行代碼重構?在一些大的項目中,代碼重構是一個必不可少的步驟。因為項目大了,代碼也就多了,後期的維護將會很難,所以我們要適當的進行代碼重構,讓代碼的可復用性提高,使軟件的設計和架構更加合理。 代碼實現和代碼重構有什麽不同呢?代碼實現的重點是功能的實現,而代碼重構則