1

単一のエミッター オブジェクトと一連のレシーバーがある状況があります。レシーバーは同じクラスであり、実際には同じタイプのデバイスのセットを表します。Qt フレームワークを使用しています。

  • エミッタ自体は、最初にデバイスの 1 つから情報を要求する信号を取得します。

  • 対応するスロットで、エミッターはどのレシーバーが「準備ができている」かを確認し、独自の信号を送信してデバイスの 1 つ (最初に準備ができている方) にデータを要求する必要があります。

Emitter はミリ秒単位で非常に高速に信号を受信します。デバイスの 1 つだけから安全にデータを要求する方法を 3 つ考えることができます (デバイスは独自のスレッドに存在するため、スレッドセーフなメカニズムが必要です)。デバイスの数は静的ではなく、変更される可能性があります。デバイスの総数は非常に少ないです (間違いなく 5 ~ 6 未満)。

1) 追加または削除されたすべてのデバイスに接続します。1 つの要求を発行し、デバイス オブジェクト自体に、特定のデバイス タグを使用して、その要求がそれらに対するものであるかどうかをフィルター処理します。チェックが行われる要求スロットは専用スレッドのコンテキストで実行されるため、この方法は便利ですが、デバイスの数が増えると無駄になります。

2) リクエストを送信する必要がある場合、オンザフライでエミッタ内のオブジェクトに接続および切断します。

3) リクエストを送信する必要がある場合は、QMetaObject::invokeMethod() を使用します。

パフォーマンスは重要です。どの方法が「最良」であるか、またはより良い方法があるかどうかを知っている人はいますか?

よろしく

プリス

注: 明確にするために: エミッターはアプリケーションから信号を取得し、デバイスにクエリを実行して情報を取得します。クレイジー ASCII アート ゴー:

(アプリ)<---->(エミッター)<------>(レシーバー)<--|-->物理デバイス

4

2 に答える 2

0

あなたが提供した情報に基づいて、私はまだReactor実装をお勧めします。ACE を使用しない場合は、独自のものを実装できます。基本的なアーキテクチャは次のとおりです。

  1. selectアプリから信号またはデータを受信したときにウェイクアップするために使用します。
  2. 送信リストにソケットの準備ができている場合は、1つを選択してデータを送信します
  3. データが送信Receiverされると、利用可能なソケット/ハンドラのセットから自身が削除されます
  4. データが処理されるRecieverと、 は利用可能な受信者のリストに自身を再登録します。

私が提案した理由は、パターンACEの実装を最も簡単に使用できるためです。Reactor

于 2012-01-08T23:05:07.227 に答える