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

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。