3

私は、複数のプロデューサーが複数のコンシューマーによって処理されるべきデータを生成するプログラムを書いています。各データの消費には約100ミリ秒かかり、ターゲットプラットフォームには多くのプロセッサが含まれているため、各プロデューサーと各コンシューマーが独自のスレッドを取得するのは自然なことのように思えます。私の質問は次のとおりです。Qtシグナル/スロットは、データブロックをプロデューサーからコンシューマーに渡すための良い方法ですか?または、より良い解決策を提案しますか(Qtが強く推奨されます)。

関連する場合に備えて、プロデューサーは1時間ごとに数十万のバーストでデータを生成します。

4

2 に答える 2

2

ここでは、シグナル/スロット メカニズムは適切ではないと思います。各シグナルは、接続されているすべてのスロットに分配されるからです。これは、シグナル/スロット メカニズムを「ワーク キュー」として使用すると、コンシューマーに負荷が分散されず、すべてのコンシューマーが同じ (重複した) 作業を行うようになることを意味します。

より良いメカニズムは、コンテナーを作業キューとして使用することです (プロデューサーはコンテナーに項目を追加し、コンシューマーはそれらを削除します)。QMutex同時実行の問題を回避するために 1 つ (最大サイズを課す場合は 2 つ)を使用QWaitConditionして、コンシューマーをブロックします。彼らに仕事がないとき。

于 2013-01-19T16:23:21.477 に答える
1

シグナルとスロットはイベントとして機能するため、シグナルが発行されると実行を制御できないため、使用を避けることをお勧めします。したがって、相互排除のためにロックまたはミューテックス (QMutex など) を使用することをお勧めします。QMutex クラスの lock メソッドと unlock メソッドを使用してキューを保護するだけです。オブジェクトを渡すとオブジェクトのコピーが渡され、ポインターを渡す場合はオブジェクトが保護されないため、シグナルとスロットを使用するよりも高速になると思います。

乾杯、

于 2013-01-19T16:09:51.877 に答える