2012-03-20 4 views
3

Если бы вы разобрали 300 байтов необработанных данных 20 раз в секунду в кучу свойств управления WPF, каково было бы ваше решение?Каков наилучший способ перехода от опроса к событиям?

В частности, у меня есть ПЛК с поддержкой Modbus, и мне нужно создать интерфейс управления WPF для управления им. Modbus - это протокол связи, который требует опроса для изменения данных. Напротив, WPF и .NET Framework в целом продвигают модель, управляемую событиями, поэтому перенаправление данных 20 раз в секунду непосредственно в элементы управления кажется мне неестественным. Мало того, что Modbus не имеет средств для представления данных об изменениях данных, но также не обеспечивает представления на высоком уровне байтов, и разработчик должен правильно анализировать массив беззнаковых шорт во что-то значимое.

Хотя анализ таких данных для меня не имеет большого значения, придумывая правильное преобразование в кучу зависимых от события DependencyProperties (привязка данных), является сложной задачей. Я бы не хотел иметь много кода инициализации или временного хранилища для отслеживания изменений.

ответ

2

Нет необходимости вставлять данные с циклическим опросом в свойства зависимостей. Такие свойства данных будут использоваться только как источник привязок, поэтому было бы достаточно, чтобы они были в классе, который реализует INotifyPropertyChanged.

Я бы предложил собирать данные около 10 циклов опроса и обновлять свойства данных не более двух раз в секунду. Вы обязательно опрашивать в отдельном потоке, так что вы должны убедиться, что вы вызываете PropertyChanged событие в потоке пользовательского интерфейса с помощью Dispatcher.BeginInvoke как в коде ниже:

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 является хорошей отправной точкой, ТНХ (нужен метод для получения обновленного свойства, хотя). Но предварительная сбор данных или ограничение частоты обновления приведут к значительному отставанию в пользовательском интерфейсе, то есть когда пользователь нажимает на клапан, чтобы его открыть, его изменения состояния должны быть как можно быстрее отражены для целей ведения журнала и реакции пользовательского интерфейса. – Yegor

+0

Подробнее о получении ... Я бы не хотел создавать отдельные свойства для всех точек данных (после разбора их несколько десятков). – Yegor

+0

Для первого момента, не должно быть никаких проблем, чтобы обновить интерфейс 20 раз в секунду. Во-вторых, вы можете продолжить класс данных со всеми точками данных в качестве членов и использовать это как тип свойства данных. – Clemens