Qt コンカレントへの変更点
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 の他のメソッドには動作の変更はなく、ソース互換性の破壊もありません。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。