Шаблон для периодического обновления данных экрана - PullRequest
2 голосов
/ 29 августа 2010

Я новичок в мире программирования с графическим интерфейсом и пишу небольшое приложение с графическим интерфейсом, используя IronPython и WinForms. Он считывает значения с внешнего устройства и отображает их в компоненте ListView (имя, значение). Я хочу периодически выполнять чтение и обновление компонента ListView с определенной фиксированной скоростью.

У меня были следующие идеи для достижения этой цели:

  • Таймер, который периодически запускает чтение / обновление экрана непосредственно в обработчике OnTick
  • Таймер, чей обработчик OnTick запускает BackgroundWorker для выполнения чтения / обновления

Поскольку первое решение будет блокировать графический интерфейс, пока цикл чтения / обновления не будет завершен, что, в зависимости от количества значений, считываемых с устройства, может занять некоторое время, я думаю, что BackgroundWorker может быть лучшим решением. Я мог бы захотеть добавить некоторые функции для управления элементами ListView позже (добавить, удалить значения и т. Д.), И заблокированный графический интерфейс не кажется хорошей идеей.

Существует ли определенный шаблон проектирования или лучший способ выполнить чтение / обновление данных экрана?

ПРИМЕЧАНИЕ : любые примеры кода могут быть IronPython или C #. Преобразование из C # в IronPython довольно простое. Спасибо!

Ответы [ 3 ]

3 голосов
/ 29 августа 2010

Лично у меня был бы один поток, который отвечает за считывание значений с устройства и сохранение данных в структуре данных, а затем System.Windows.Forms.Timer (в .NET есть 3 Timer s, это единственныйтот, который помечает в потоке, что безопасно обновлять ваши элементы управления) для чтения значений из этой структуры данных и обновления пользовательского интерфейса.Вам может потребоваться синхронизировать эту структуру данных, а может и нет.

Таким образом, устройство может получать столько времени, сколько ему нравится, чтобы вернуть данные, или оно может выдавать вам столько миллионов строк в секунду, иПоток пользовательского интерфейса будет по-прежнему опрашивать с заданной вами частотой тиков (вероятно, каждые 100 мсек?).Поскольку ваши таймеры просто читают данные из памяти, пользовательский интерфейс не блокируется для ввода-вывода.

2 голосов
/ 29 августа 2010

BackgroundWorker предпочтительнее, когда у вас много работы в фоновом режиме.

Используйте Timer для запуска функции, которая будет выполнять необходимую работу во втором потоке.

Он не заблокирует пользовательский интерфейс. (не забудьте обновить элементы управления в потоке пользовательского интерфейса) .

System.Threading.Thread newThread;
newThread = new System.Threading.Thread(anObject.AMethod);

http://msdn.microsoft.com/fr-fr/library/ms173178(VS.80).aspx

1 голос
/ 29 августа 2010

Другой вариант, вместо того, чтобы заставить работать таймер и рабочий фоновый поток, - использовать System.Threading.Timer , это будет выполнять ваш метод в потоке через регулярные промежутки времени и после данные, которые вы можете использовать Control.Invoke или Control.BeginInvoke для обновления элемента управления в потоке пользовательского интерфейса.

...