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公司及其它国家和地区商标。