Spec-Zone.ru › Qt 5.15

Конкурентное выполнение

Функция QtConcurrent::run() выполняет функцию в отдельном потоке. Возвращаемое значение функции доступно через API QFuture.

Эта функция является частью фреймворка Qt Concurrent.

Выполнение функции в отдельном потоке

Для выполнения функции в другом потоке используйте QtConcurrent::run():

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

Это запустит aFunction в отдельном потоке, полученном из стандартного QThreadPool. Вы можете использовать классы 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() также принимает указатели на методы-члены. Первый аргумент должен быть либо константной ссылкой, либо указателем на экземпляр класса. Передача по константной ссылке полезна при вызове константных методов-членов; передача по указателю полезна для вызова неконстантных методов-членов, которые изменяют экземпляр.

Например, вызов QByteArray::split() (константный метод-член) в отдельном потоке выполняется следующим образом:

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

Вызов неконстантного метода-члена выполняется следующим образом:

// 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

Использование лямбда-функций

Вызов лямбда-функции выполняется следующим образом:

QFuture<void> future = QtConcurrent::run([=]() {
    // Code in this block will run in another thread
});
...

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qtconcurrentrun.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API