Большой объем, высокоскоростное текстовое поле в .Net - PullRequest
5 голосов
/ 30 ноября 2010

Я пишу приложение, которое будет отображать последовательные данные / данные USB со скоростью до 250kb / sec . Я использую класс .net SerialPort и реагирую на событие DataReceived. Для ранних реализаций этого программного обеспечения я просто сохранял входящие данные в WinForms RichTextBox. Это решение работает нормально, пока в элементе управления не будет 50k - 100k строк , после чего приложение закроется. С тех пор я попытался достичь своих целей с помощью WPF и обнаружил ту же проблему. В какой-то момент я попытался сохранить только текст , видимый в данный момент , в текстовом поле, а остальные сохранить в large List<string>, но для этого решения потребовалось огромное количество обходных путей и , в конце концов, был заброшен - Я бы предпочел не изобретать велосипед .

Теперь я прихожу к вам с надеждой - я готов попробовать что-нибудь ! Должен ли я использовать пользовательский элемент управления (как платные, так и бесплатные элементы управления приветствуются)? SQLite ? Виртуализация как описано выше? Должен ли я опрашивать SerialPort вместо реакции на события?

Ответы [ 2 ]

5 голосов
/ 30 ноября 2010

Используйте поток, чтобы прочитать данные и записать их непосредственно в файл.Попросите ваше приложение обновлять последнее число строк из файла так часто.Может быть, даже обновление будет основано на уведомлении из потока читателя?

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

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

4 голосов
/ 30 ноября 2010

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

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

...