Qt并发的更改

Qt 6是经过深思熟虑的框架,旨在使其更加高效和易于使用。

我们试图在每次发布中都维护所有公共API的二进制和源代码兼容性。但由于Qt框架的改进,一些变化是不可避免的。

在本主题中,我们总结了Qt并发的这些更改,并提供有关如何处理它们的指导。

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

最简单的解决方案是通过lambda调用重载函数

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的其它方法没有行为变更,并且没有引入源代码兼容性问题。

© 2024 Qt公司有限公司。此处包含的文档贡献是各自所有者的版权。此处提供的文档是按照自由软件基金会发布的GNU自由文档许可版1.3的条款许可的。Qt及其相关标志是芬兰的Qt公司及其它国家和地区商标。