Spec-Zone.ru › Qt 6.1

Изменения в Qt Concurrent

Qt 6 является результатом целенаправленных усилий по повышению эффективности и удобства использования фреймворка.

Мы стараемся поддерживать бинарную и исходную совместимость для всех публичных API в каждом релизе. Но некоторые изменения были неизбежны, чтобы сделать Qt лучшим фреймворком.

В этой теме мы обобщаем эти изменения в Qt Concurrent и предоставляем рекомендации по работе с ними.

QtConcurrent::run()

QtConcurrent::run() был улучшен для работы с переменным числом аргументов, поэтому сигнатуры изменены на:

// run
template <typename T>
QFuture<T> run(Function &&f, Args &&...args)

// run with a QThreadPool argument
template <typename T>
QFuture<T> run(QThreadPool *pool, Function &&f, Args &&...args)

В качестве побочного эффекта, если f является указателем на член-функцию, первый аргумент args должен быть объектом, для которого этот член определен (или ссылкой, или указателем на него). Поэтому вместо написания:

QImage image = ...;
QFuture<void> future = QtConcurrent::run(&image, &QImage::invertPixels, QImage::InvertRgba);

Вы должны написать:

QFuture<void> future = QtConcurrent::run(&QImage::invertPixels, &image, QImage::InvertRgba);

Еще один побочный эффект заключается в том, что QtConcurrent::run() больше не будет работать с перегруженными функциями. Например, приведенный ниже код не будет компилироваться:

void foo(int arg);
void foo(int arg1, int arg2);
...
QFuture<void> future = QtConcurrent::run(foo, 42);

Самое простое решение — вызвать перегруженную функцию через лямбда-выражение:

QFuture<void> future = QtConcurrent::run([] { foo(42); });

Или вы можете указать компилятору, какую перегрузку выбрать, используя static_cast:

QFuture<void> future = QtConcurrent::run(static_cast<void(*)(int)>(foo), 42);

Или qOverload:

QFuture<void> future = QtConcurrent::run(qOverload<int>(foo), 42);

Другие методы QtConcurrent не претерпели изменений в поведении и не вносят разрывов исходной совместимости.

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

Spec-Zone.ru

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