サブクラス化された QThread を含むクラスに昇格される内部に 3 つのウィジェットを含む QMainWindow があります。それらはそれぞれ、rexpective qthread でローカル QImage を描画します。これは、描画されるとシグナルとともに送信され、スロットから update (mandlebrot の例) を呼び出してレンダリングされます。これは安全ですか、それとも危険ですか?彼らはデータを共有していません。少なくとも私が生成しているデータは共有しておらず、私のコーディング範囲外、つまり Qt によって自動的に生成されたデータを共有できるのか疑問に思っています。
1 に答える
ドキュメントから:
QPainterは、QImage、QPrinter、およびQPictureペイントデバイスへのペイントに使用できます。QPixmapsおよびQWidgetsへのペイントはサポートされていません。Mac OS Xでは、GUIスレッドの外部から印刷している場合、自動進行状況ダイアログは表示されません。
任意の数のスレッドがいつでもペイントできますが、特定のペイントデバイスでペイントできるのは一度に1つのスレッドのみです。つまり、それぞれが別々のQImageにペイントする場合、2つのスレッドは同時にペイントできますが、2つのスレッドは同じQImageに同時にペイントすることはできません。
FontConfigをサポートしていないX11システムでは、QtはGUIスレッドの外部にテキストをレンダリングできないことに注意してください。QFontDatabase :: supportsThreadedFontRendering()関数を使用して、GUIスレッドの外部でフォントレンダリングを使用できるかどうかを検出できます。
X11でのフォントの問題に注意している限り、Pixmapまたはカーソル(Pixmapとして実装されている)を使用したり、複数のスレッドから同時に同じ画像にペイントしようとしたりしないでください。 ..動作するはずです。
マンデルブロの例では、QImageはシグナルを介して値によって渡される(暗黙的に共有される)ことに注意してください。つまり、いずれかのスレッドが書き込みを試みると、独自のコピーを取得します。