2012-03-20 20 views
3

300バイトの生データを1秒間に20回解析してWPFコントロールプロパティの束にする場合、あなたの解決策は何ですか?ポーリングからイベントに変更する最も良い方法は何ですか?

具体的には、私はModbus対応PLCを持っており、WPF HMIを制御する必要があります。 Modbusはデータ変更のためのポーリングを必要とする通信プロトコルです。対照的に、WPFと.NET Frameworkは一般的にイベントドリブンモデルを推進しているので、データをコントロールに直接20回プッシュすることは私には不自然に思えます。 Modbusはデータの変更を報告する手段が欠けているだけでなく、バ​​イトの高水準表現も提供していません。また、無署名のshort配列を意味のあるものに適切に分解するのは開発者次第です。

このようなデータの解析は大したことではありませんが、イベント対応のDependencyProperties(データバインディングが想定されている)の束に適切に変換することは困難です。私は、変更を監視するための初期化コードや一時記憶域をたくさん持っているのは嫌です。

答えて

2

周期的にポーリングされたデータを依存プロパティに入れる必要はありません。そのようなデータプロパティは、バインディングのソースとしてのみ使用されるので、INotifyPropertyChangedを実装するクラスでそれらを持つことで十分です。

約10回のポーリングサイクルのデータを収集し、1秒あたり2回以下のデータプロパティを更新することをお勧めします。 THX(メソッドを必要とする、良い点がある

public class DataCollector : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private byte[] someData; 

    public byte[] SomeData 
    { 
     get { return someData; } 
     set 
     { 
      someData = value; 

      if (PropertyChanged != null) 
      { 
       Application.Current.Dispatcher.BeginInvoke(PropertyChanged, this, new PropertyChangingEventArgs("SomeData")); 
      } 
     } 
    } 
} 
+0

がINotifyPropertyChangedの使用:あなたは確かに別々のスレッドでポーリングしますので、あなたは以下のコードのようにDispatcher.BeginInvokeによってUIスレッド上PropertyChangedイベントを呼び出すようにしてください更新されたプロパティを取得するため)。しかし、データを収集したり更新頻度を制限したりすると、UIに大きな遅れが生じます。つまり、ユーザーがバルブをクリックして開くと、ロギングの目的やUIの応答性にできるだけ早く反映される必要があります。 – Yegor

+0

取得に関する詳細...すべてのデータポイントに対して別々のプロパティを作成するのは嫌いです(解析後に数十もある)。 – Yegor

+0

最初の点では、1秒間に20回UIを更新することは問題ありません。第二に、すべてのデータポイントをメンバーとするデータクラスを作成し、それをデータプロパティのタイプとして使用することができます。 – Clemens

関連する問題