1

そこで、可変数のスレッドを必要とする qt アプリケーションを作成しようとしました。クラスを作成する前にスレッドに使用したメソッドを使用し、そのオブジェクトで moveToThread 関数を使用するつもりでした。しかし、今回は QObjects の配列があり、それぞれを別のスレッドに移動します。

私の質問は次のとおりです。その配列から要素を送信して別のスレッドに配置すると、配列が壊れますか、それとも正常に動作しますか? オブジェクトを別のスレッドに移動することが実際にメモリ内を移動するかどうかはわかりません。

記録のために、他の誰かの提案で、可変数の代わりにたった 2 つのスレッドを使用してアプリケーションを作成する方法を見つけました。しかし、私はまだこれがどのように機能するか知りたいです。

4

3 に答える 3

1

QObject を別のスレッドに移動しても、メモリ内はまったく移動しません。いいえ、私はあなたの配列を壊しません。

QObject を別のスレッドに移動すると、そのスレッド アフィニティが変更されます。主な効果はイベント処理に関するものです。オブジェクトに送信されたイベントは、オブジェクトのスレッドのイベント ループによって処理されます。オブジェクトのスレッドがイベント ループを実行していない場合、イベントは取得されません。

親/子関係を介して作成された完全な QObject ツリーは、同じスレッドに存在する必要があることに注意してください。さらに、オブジェクトのスレッドからオブジェクトを削除する必要があります。

配列に戻る: QObjects を別のスレッドに移動しても、配列が壊れることはありません。ただし、メイン スレッドから配列内の QObject に実際にアクセスする場合は、十分に注意する必要があります。適切なロックとミューテックスが必要です。 QObject はスレッドセーフではないため、競合状態を防止します。

したがって、配列自体は問題ありませんが、適切にロックしないと実際に QObjects を使用することはできません。

于 2013-06-27T20:44:46.870 に答える
0

一般に、Qt の設計パターンは、オブジェクトが作業を行うはずのスレッドで作業を行い、スレッドセーフなシグナル/スロットを使用してオブジェクトと通信することです。配列などを介してワーカーと直接通信することを「回避する」必要があると私は主張します。

ただし、他の人が言ったように、そうしても配列が壊れてはいけません - ただし、他の人が言ったように、オブジェクトを削除しようとしないでください(詳細については: http://qt-project.org/doc/qt-4.8 /threads-qobject.html )。

于 2013-06-27T20:46:33.763 に答える