Qtモジュールにおけるスレッドサポート

スレッドと SQL モジュール

データベース接続は、それを作成したスレッド内でのみ使用する必要があります。接続を別のスレッドに移動するには、QSqlDatabase::moveToThread() を使用します。

さらに、QSqlDrivers によって使用されるサードパーティライブラリは、マルチスレッドプログラムで SQL モジュールを使用する際にさらなる制限を課すことができます。詳細については、データベースクライアントのマニュアルを参照してください。

スレッドでのペイント

QPainter をスレッドで使用して、 、 、 、(ほとんどのプラットフォームでは) のペイントデバイスにペイントすることができます。QWidgetsへのペイントはサポートされてQImage QPrinter QPicture QPixmap いません。macOS では、GUI スレッドの外から印刷する場合、自動進行ダイアログは表示されません。

一度にいくつのスレッドでもペイントできますが、指定されたペイント・デバイスにペイントできるのは一度に1つのスレッドのみです。言い換えると、2つのスレッドがそれぞれ別の QImage にペイントする場合は同時にペイントできますが、2つのスレッドが同じQImage に同時にペイントすることはできません。

スレッドとリッチテキスト処理

QTextDocumentQTextCursor 、およびすべての関連クラスはリエントラントです。

GUI スレッドで作成されたQTextDocument インスタンスにはQPixmap 画像リソースが含まれる場合があることに注意してください。QTextDocument::clone() を使って文書のコピーを作成し、そのコピーを別のスレッドに渡してさらなる処理(印刷など)を行ってください。

スレッドと SVG モジュール

QtSvg モジュールのQSvgGeneratorQSvgRenderer クラスはリエントラントである。

スレッドと暗黙の共有クラス

Qt では、QImageQString など、多くの値クラスで暗黙的共有と呼ばれる最適化を使用しています。Qt 4 以降、暗黙的共有クラスは、他の値クラスと同様に、スレッド間で安全にコピーできます。これらは完全にリエントラントです。暗黙的な共有は本当に暗黙的です。

多くの人が暗黙の共有とマルチスレッドは相容れない概念だと考えています。しかしQtでは、アトミック参照カウントを使用して共有データの完全性を保証し、参照カウンターの破損を防ぎます。

アトミック参照カウントはスレッドセーフを保証しないことに注意してください。スレッド間で暗黙の共有クラスのインスタンスを共有する場合は、適切なロックを使用する必要があります。これは、共有されているかどうかにかかわらず、すべてのリエントラント・クラスに課される要求と同じである。しかし、アトミック参照カウントは、暗黙的に共有されたクラスのローカルインスタンスで作業するスレッドの安全性を保証します。スレッド間のデータの受け渡しにはシグナルとスロットを使うことを推奨する。

まとめると、Qt 4 の暗黙的に共有されるクラスは本当に暗黙的に共有されます。マルチスレッドアプリケーションであっても、共有されない、リエントラントな値ベースのクラスであるかのように安全に使用することができます。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.