Самый эффективный способ отображения моих данных для быстрого обновления данных - PullRequest
0 голосов
/ 19 сентября 2011

Я все еще сталкиваюсь с C Sharp и .NET и работаю над приложением для отображения данных, постоянно читаемых с USB-устройства. У меня работает весь USB-код, и он получает обновления данных каждые 5 мс. Данные состоят из набора значений датчиков для нескольких единиц, скажем, 50 единиц с 12 датчиками на единицу.

В настоящее время я использую объект ListBox для отображения 50 строк данных. Я устанавливаю режим списка в OwnerDrawFixed, а мой источник данных - в массив данных, представляющий данные, считываемые с устройства USB (один объект на строку в ListBox), и использую событие DrawItem для графического рисования каждой строки. списка в соответствии с запросом списка (я делаю это таким образом, чтобы включить цвет текста, форматирование, аккуратный макет и т. д.).

Чтобы ListBox обновлял отображаемые данные, я периодически звоню Invalidate, чтобы принудительно перерисовать его, но это ужасно медленно и недопустимо мерцает даже при низких частотах, таких как обновления за 1 секунду, не говоря уже о том, чтобы куда-нибудь попасть около 5 мс обновления датчиков.

Может ли кто-нибудь предложить лучший подход к обновлению данных на экране, возможно, такой, где я не все рисую каждый раз, или, возможно, способ сказать ListBox перерисовывать только одну строку, возможно, если данные в этой строке изменились?

В любом случае я не привязан к ListBox, это просто мое незнакомство с платформой .Net - возможно, лучшим решением может быть рендеринг всего в растровое изображение и затем перетаскивание его на экран одним действием.

Я уже читал похожий вопрос, но предложения там не очень помогли ... c # - быстрое обновление данных ListBox

Любые альтернативные предложения от опытных разработчиков .net с благодарностью ...

Ответы [ 4 ]

1 голос
/ 20 сентября 2011

Для тех, кто заинтересован в том, чтобы решение, которое работало для меня, безотказно и быстро мерцало.

Я просто использую элемент управления Panel для представления своей таблицы в режиме конструктора, затем в моем коде у меня есть метод, который запускается таймером каждые 1 мс (хотя в действительности я не могу получить его быстрее, чем каждые 16 мс - что, я думаю, вероятно связано с частотой обновления 60 Гц на мониторе, потому что я делаю графические блики).

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

Это также работает быстро, и на самом деле это не больше, чем предыдущее медленное / мерцающее решение с использованием элемента управления списком, однако следует отметить, что не поддерживается выбор строк и т. Д. (Так как это приложение использовало только ListBox для отображения данных).

Сейчас я серьезно рассматриваю предложение по мини-технологиям для будущей работы со списками, так как эта работа работает фантастически хорошо, и создание подкласса ListBox (вместо того, чтобы основывать его на элементе управления Panel) позволило бы мне унаследовать некоторые элементы выбора строк и т. Д. .

Спасибо за все предложения, Рич

1 голос
/ 19 сентября 2011

Очень сложно дать рекомендацию, не зная, что вы делаете. Вы можете объяснить, что такое ваши «данные», «значения датчика» и «единицы измерения». В целом, графика лучше отображать большие наборы данных, чем обширные списки чисел.

Если это какие-то временные данные, например, интенсивность звука, вы можете рассмотреть тип дисплея VU-метра, как в музыкальном проигрывателе.

Если вы пытаетесь отслеживать тенденции или изменения, рассмотрите спарклайн или график.

Если вы пытаетесь показать корреляции между данными, рассмотрите спектр или график XY.

1 голос
/ 20 сентября 2011

В WPF вы можете заполнить ListBox в начале и после чего просто отправлять данные в макет асинхронно. Если возможно использовать WPF, попробуйте. Код является тривиальным, если у вас постоянное количество элементов данных.

1 голос
/ 19 сентября 2011

Наследовать элемент управления ListBox и включить двойную буферизацию, я думаю, ваш лучший выбор. Я не знаю, как рисует ListBox, но это должно уменьшить мерцание.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...