3

可変レートでデータを更新する Java アプリがあります (かなり高速なデータ ストリームから受信され、制御不能ですが、最大 120K バイト/秒)、受信したバイト数/パケット数などの統計を表示したいと考えています。 、ダイアログ ボックスを使用します。

私はJGoodies バインディングを調べており、低レートで受信した人工データで予備的に機能するものを手に入れました。

私がやりたいことは、大まかに次のとおりです。

  1. Bean クラスを次のようにします。

    public class Statistics
    {
      private int bytes;
      private int goodPackets;
      private int badPackets;
      private int totalPackets;
    
      public int getBytes() { return bytes; }
      public int getGoodPackets() { return goodPackets; }
      public int getBadPackets() { return badPackets; }
      public int getTotalPackets() { return totalPackets; }
    
      public void update(/* TBD */) { /* updates the fields appropriately */ }
      public Statistics() { bytes=goodPackets=badPackets=totalPackets=0; }
    }
    
    Statistics stats;
    
  2. 私のGUIの要素に4つのフィールドをバインドします

  3. stats.update()メインアプリケーションスレッドで必要な速度で呼び出すことができます。「更新」への呼び出しがGUIの変更リスナーをトリガーするものです
  4. GUI を指定できる低いレート (約 5 ~ 20 Hz) で「自動的に」更新するので、トリガーされたイベントの塊に圧倒されません。

私がやりたいことをさせてくれる適切なメカニズムはありますか?JGoodies DelayedReadValueModel を見ていますが、使い方がよくわかりません。

自分で手動で行う必要がある場合、おそらく次のことを行うと思います。

  1. Statistics のミラーリングされたコピーを持ち、ある種の更新フラグ、オリジナルからミラーリングされたコピーへのリンク、およびタイマーのタイムアウトを追加します。
  2. メソッドがupdate()呼び出されたら、更新フラグを設定し、次のようなメソッドを呼び出しますmaybePropagate()
  3. maybePropagate(): タイマーのタイムアウトが進行中の場合、またはミラーリングされたコピーへのリンクが null の場合、何もしません。それ以外の場合は、タイムアウトを開始し、更新されたデータをミラー コピーに送信し、更新フラグをクリアします。
  4. タイマーのタイムアウトが切れたときに、更新フラグが設定されていて、ミラーリングされたコピーへのリンクが null でない場合、更新されたデータをミラーリングされたコピーに送信し、更新フラグをクリアします。
  5. 前の 4 つの要素を実装すると、ミラー コピーの更新速度が最大になるため、通常の JGoodies BeanAdapter を使用してミラー コピーのフィールドに GUI 要素をバインドするだけで済みます。

助言がありますか?

4

2 に答える 2

3

JGoodies Binding は Delayed* クラスを使用してこの問題に対処しますが、標準の Swing 機能を使用するアプローチを検討することもできます。

SwingWorker を使用すると、要素をバックグラウンドで公開し、EDT で処理できます。SwingWorker プロセスはパブリッシュされたデータのチャンクを取得し、EDT 変更の数を減らします。

于 2012-06-01T08:44:56.570 に答える
1

統計のプレゼンテーション モデルを取得した場合、バインディング コードは次のようになります。

ValueModel bytesModel = statsPresentationModel.getModel("bytes");
label = BasicComponentFactory.createLabel(bytesModel);

更新を遅らせるために、バイト フィールドの値モデルをラップできます。

ValueModel bytesModel = new DelayedReadValueModel(statsPresentationModel.getModel("bytes"));
label = BasicComponentFactory.createLabel(bytesModel);
于 2011-02-03T20:33:36.813 に答える