Изменения в 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.2/concurrent-changes-qt6.html