В окне отображаю лог довольно длительного процесса (5000 операций в среднем по 10 строчек каждая, потом будет и больше вплоть до 500k строчек)
Как известно, plain text убог :) например, на MacOS в стандартном блокноте только rich text.
вот и у меня для удобства чтения и для красоты часть строчек имеет свой цвет, часть кусков текста выделяется желтым маркером, возможно даже будут ссылки или и того круче - спойлеры из UIElement.
Но после того, как строк накопится много, лог тормозит и на выделение его кусков мышью (причем кусков совсем маленьких) и - что самое неприятное - на само добавление строк.
Есть ли что-то шустрее?
Решил попробовать три варианта - Syncfusion, Telerik и ComponentOne - и замерить. И ни один не заработал вообще.
Видно, не мой день.
(С первым разобрался, сделал все по аналогии с оригиналом, все работает, но строки добавленной не видно.
Второй вылетает при простом добавлении самого rtb в пустое окно свежесозданного проекта точь-в-точь по мануалу Getting started.
Со третьим разобрался, сделал все по аналогии с оригиналом, все работает, но строки добавленной не видно.
Пишу в саппорты...)
Единственным заработал AvalonEdit, но он заточен под подсветку синтаксиса, и я не понял, как в нем просто взять и задать шрифт для такого-то участка. И примитивный он какой-то по виду.
Основная проблема в том, что вы загружаете большой кусок данных в текстовое поле. Почему бы вам не подойти к данной проблеме с другой стороны - к примеру, не использовать Grid с постраничной навигацией или же тот же RichTextBox, но данные в тем будут выводиться по страницам. Так же, можно добавить "подгрузку" данных, подписавшись на событие прокрутки - если дошли до, скажем, 75% строк, подгрузить данные, в первые блок выгрузить после достижения 100%.
страницы неудобно. тогда уж скролл. это единственное рацпредложение из всего ответа ;)
откуда они подгружаться будут?
из файла не вариант, сохраняется в txt, форматирование теряется.
из другого FlowDocument, лежащего в памяти?
хм... это можно попробовать.
но вы видели "бесконечный скролл", который бы работал не только снизу как обычно, а и сверху (как требуется для лога)? :) я нет
Impeeeery: Я скорее имел ввиду именно механизм постраничной навигации :) Он отличается от бесконечного скоролла тем, что держит загруженными максимум 2 страницы. Как реализовать - в целом можно заморочиться и написать. но тут понятие целесообразности - а стоит ли оно того.
По факту то - RTF Control будет работать все медленнее и медленнее, с увеличением количества записей лога.
Еще как вариант, использовать HTML для отображения, хранить данные лога в виде HTML разметки. И да, я предлагаю хранить его в файле.
Я скорее имел ввиду именно механизм постраничной навигации :) Он отличается от бесконечного скоролла тем, что держит загруженными максимум 2 страницы.
не вижу связи, и скролл может так
По факту то - RTF Control будет работать все медленнее и медленнее, с увеличением количества записей лога.
почему?
если не брать визуализацию. то грубо говоря это просто коллекция разных элементов. коллекция же не начинает медленнее добавлять элементы когда их много?
если же брать визуализацию, то при добавлении строк (и скролле до конца с каждой строчкой) затрагиваться должно лишь то, что отображается. меняются координаты скролла - где-то там инкрементится высота НОВОГО элемента. пересчитывать предыдущие элементы при этом не вижу смысла. просто это какой-то говнокод там, но не факт, что он в rtb, а не глубже((
Еще как вариант, использовать HTML для отображения, хранить данные лога в виде HTML разметки
IE малоприятная вещь, нифига не быстрая, окно зависает при загрузке и т.п., 100 МБ хрома не будешь таскать, а главное в html не вставишь UIElement, а на самом html боже упаси лишний раз что-то писать :)
Александр Кузнецов: с выделением вообще абсурд - тормозит, даже если выделяю в пределах 1 строки.
оно что, при каждом выделении пересчитывает top и height всех предыдущих элементов, чтобы понять, где рисовать синюю рамку? :)
ДА ЕЩЕ И ВСЕХ ПОСЛЕИДУЩИХ?! (когда в самом верху нахожусь - тоже тормоза)
это должно делаться еще при добавлении элементов (+ в событии Resize той строки, в которой, допустим, есть UIElement и он вдруг самопроизвольно меняет высоту)... ну или при скролле, или первом выделении на одном и то же месте хотя бы.
Вы серьёзно хотите добавить в свою программу многомиллионный лог с прокруткой? Хотел бы я посмотреть, как вы этот лог читаете) Лог на то и есть лог, что его никто не читает при нормальной работе приложения. А если случится ошибка, просматривать миллионный строчек ради file io exception смысла не имеет. Не пишите в лог все подряд и сохраняйте плчаще в оьдельныеифайлы+вообще не выводите их. Для нормальной программы 90%. таких логов - файлопомойка, занимающая место.
Вы серьёзно хотите добавить в свою программу многомиллионный лог с прокруткой? Хотел бы я посмотреть, как вы этот лог читаете)
Выше человек не подумав написал "оставьте лишь последние N строчек".
но:
1) там еще дата и время для многих операций, вдруг мне захочется посмотреть во сколько времени был начат весь процесс, а это в начале
2) вдруг я забыл посмотреть не было ли варнингов в начале процесса, а лог уже убежал
Значит, нужно еще и начало оставить.
А что по середине?
С серединой процесса и т.п. - конечно, сложнее, так как сложно ее поймать, но примерно - можно, она тоже может понадобится зачем-либо.
При все этом, если нужно сделать поиск, по содержанию, или по типу сообщений (ошибка, варнинг) - то можно его сделать. Особенно с ошибками: просто писать рядом "N ошибок", кликаешь на эту надпись - открывается попап со ссылками на ошибки в логе.
Не пишите в лог все подряд и сохраняйте плчаще в оьдельныеифайлы+вообще не выводите их.
в уже запущенной программе смотреть всегда удобнее, чем открывать по новой где-то и ждать пока прогрузится.
в конце-концов в уже запущенной можно даже не ставя процесс на паузу и вообще не подходя к компу увидеть падающие ошибки - красным шрифтом, как раз благодаря RTF. а файл не ставя процесс на паузу может и вовсе не открыться - он же может быть занят.
эргономика, блджад!
сейчас сия наука в опе, свое и чужое время и силы люди не ценят, в форме входа на сайте (именно входа, а не регистрации) могут сделать галочку "Я согласен с условиями" и ставь ее каждый раз, или родить такой ответ, как ваш.
а лет через 200 до людей дойдет...
Тем более, быструю работу хоть при лярде строк могли предусмотреть сами разрабы RichTextBox, но вместо этого накатали какой-то гавнокод (см. комменты к ответу Кузнецова)
Impeeeery: искать и читать лог можно спокойно из файла, не останавливая основной процесс, удаленно.
Удобнее в запущенной программе? То-то вы на этом сайте оказались. Удобство из ушей уже вываливается.
Хотите именно программу? Создайте отдельный процесс - какой-нибудь логгер; и пусть работает как сервис и оперирует файлами логов, что бы было удобно их смотреть.
Логи должны относиться к какому-то конкретному промежутку времени и циклу действий. Все остальное - задача их представления администратору.
"эргономика, блджад!
сейчас сия наука в опе, свое и чуж..." - какой то бред сумасшедшего.)
Удобнее в запущенной программе? То-то вы на этом сайте оказались. Удобство из ушей уже вываливается.
?
Хотите именно программу? Создайте отдельный процесс - какой-нибудь логгер; и пусть работает как сервис и оперирует файлами логов, что бы было удобно их смотреть.
1. "что бы" пишется слитно. как вы даете мне советы по языку программирования, если родного языка не знаете?
2. а зачем создавать отдельный процесс, и усложнять архитектуру, когда можно в том же самом?
Все остальное - задача их представления администратору.
слишком жестким канцеляритом рассуждаете, вам бы в чиновники.
Impeeeery: видно, у вас закончились аргументы))
Вы попробовали сделать, как хотели. У вас не получилось - вы пришли сюда. Вам сказали, как надо сделать правильно. Вы не хотите, переходите к оскорблениям, развиваете демагогию. Ну тогда мучайтесь, пытайтесь сделать то, что по определению нельзя. А потом просто скачайте логгер из нугета и посмотрите его устройство.
Griboks: у меня все получается.
вопрос лишь времени.
сюда пришел для галочки и поболтать. толку тут мало. что знают тут - то и я знаю.
не хочу я логгер готовый юзать, логгер могу себе позволить и самому написать.