Qt 并行计算 Concurrent Run的翻译

资料来源:https://doc.qt.io/qt-5/qtconcurrentrun.html

Concurrent Run的简介:

QtConcurrent::run() 是开启单独一个线程来运行。返回值可以通过QFuture API来调取。

在单独的线程中运行
QtConcurrent::run();

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

run()函数将在默认的QThreadPool 中单独一个线程来运行。可以通过QFuture和QFutureWatcher 类来查看此函数run()运行的状态。

可以专门开设线程池(pool),如下:

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

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);

当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并行计算圆周率示例

上一篇:QThreadPool类和QtConcurrent命名空间


下一篇:Windows驱动开发-r3和r0通信