Qt 并行计算 Concurrent Run的翻译
資料來源:https://doc.qt.io/qt-5/qtconcurrentrun.html
Concurrent Run的簡介:
QtConcurrent::run() 是開啟單獨一個線程來運行。返回值可以通過QFuture API來調取。
在單獨的線程中運行:
QtConcurrent::run();
run()函數將在默認的QThreadPool 中單獨一個線程來運行。可以通過QFuture和QFutureWatcher 類來查看此函數run()運行的狀態。
可以專門開設線程池(pool),如下:
extern void aFunction(); QThreadPool pool; QFuture<void> future = QtConcurrent::run(&pool, aFunction);run()函數中的參數傳遞:
例如:
當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() 函數將阻塞,一直等到result結果出來。可以通過QFutureWatcher 來獲取 執行完畢和計算結果的通知。
run函數的其他特性:
使用成員函數:
QtConcurrent::run() 同樣接受指向成員函數的指針。這樣,run函數的第一個參數可以是指向常量的指針,或者指向一個類的對象。
如果傳遞是常量,通常是調入常量處理的函數指針。
如果傳遞是指針,同時是跳入非常量處理的函數指針。
例如:通過調入QByteArray::split() (a const member function) 在單獨一個線程中處理:
// call 'QList<QByteArray> QByteArray::split(char sep) const' in a separate thread QByteArray bytearray = "hello world"; QFuture<QList<QByteArray> > future = QtConcurrent::run(bytearray, &QByteArray::split, ','); ... QList<QByteArray> result = future.result();調入Calling a non-const member 函數如下:
// call 'void QImage::invertPixels(InvertMode mode)' in a separate thread QImage image = ...; QFuture<void> future = QtConcurrent::run(&image, &QImage::invertPixels, QImage::InvertRgba); ... future.waitForFinished(); // At this point, the pixels in 'image' have been inverted支持使用Lamdba 函數如下:
QFuture<void> future = QtConcurrent::run([=]() {// Code in this block will run in another thread }); ...本篇翻譯完畢!
有關并行計算的應用,請看Qt并行計算圓周率示例
總結
以上是生活随笔為你收集整理的Qt 并行计算 Concurrent Run的翻译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt 多线程TCP服务端一键关闭所有客户
- 下一篇: Qt 并行计算圆周率示例