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
Qt之Concurrent框架
簡述 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 解壓
Qt之zip壓縮/解壓縮(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級考試,考完在大學+碩士期間沒有用到編程。 來到
QT之QSignalMapper(可以理解為轉發器,多個按鈕綁定到一個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設計應用中,需要用到自定義形狀頭像,在這裏,我對圓形頭像的設計做簡單的闡述,其它形狀頭像可參考本文做相應的更改即可。如下圖所
Qt之QEvent(所有事件的翻譯)
sin ini 隊列 方便 erp 拖放 sdn 所有 area QEvent 類是所有事件類的基類,事件對象包含事件參數。 Qt 的主事件循環(QCoreApplication::exec())從事件隊列中獲取本地窗口系統事件,將它們轉化為 QEvents,然後將轉換後
Qt之QLabel
不同顏色 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 代碼重構 首先我們來講講為什麽要進行代碼重構?在一些大的項目中,代碼重構是一個必不可少的步驟。因為項目大了,代碼也就多了,後期的維護將會很難,所以我們要適當的進行代碼重構,讓代碼的可復用性提高,使軟件的設計和架構更加合理。 代碼實現和代碼重構有什麽不同呢?代碼實現的重點是功能的實現,而代碼重構則