2010-08-29 1 views
2

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

я имел следующие идеи для выполнения этого:

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

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

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

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

ответ

3

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

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

2

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

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

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

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

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

+0

Зависит от того, какой таймер вы используете - winforms, threading и timers - это опции. –

1

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

Смежные вопросы