-
Приветствую товарищи. Сейчас занимаюсь разработкой текстового редактора с подсветкой синтаксиса. Проблемка в том, что при вводе текста нужно
запускать текст на пересканировку. На относительно не больших файлах (до 10000 стр) все работает не заметно, а вот как быть при больших...
100000-1000000 стр. нажимаешь клавишу и ждешь 1-2 сек пока программа отвиснет.
У меня для сканирования определена отдельная функция, где этот текст прогоняется циклом от начала до конца.
Правильнее, наверное, было бы так:
1) при каждом изменении текста(ввод\вставка из буфера) обновить сражу же видимую часть экрана (чтобы пользователь ничего не заметил),
а все остальное "потихоньку" досканировать
2) если предыдущее сканирование не закончено, а пользователь что-то ввел, то оборвать предыдущее сканирование и начать новое.
Но пока не думал как это реализовать, можно ли будет обойтись без таймера?
Может кто когда писал такое? Помогите советом.
-
> [0] aka © (07.04.17 17:12)
Только видимое на экране вряд ли получится, надо же разбор всего текста делать. С изменением теста уже проще, тут полный переразбор не нужен, достаточно в разобранном изменять.
-
> 100000-1000000 стр.
строк или страниц?
и даже если строк, то что ж это за документища такие????
-
>
> Только видимое на экране вряд ли получится, надо же разбор
> всего текста делать.
Разбор достаточно делать с места изменения и до конца, то что выше можно не трогать, так что все должно получаться
> С изменением теста уже проще, тут полный переразбор не нужен,
> достаточно в разобранном изменять.
Ну, к примеру, ввели одинарную или двойную кавычку и строки стали не строками, а то что было строкой может быть названием функции или переменной, так что пересканировать нужно будет все равно все.
-
> kilkennycat © (07.04.17 17:42) [2]
>
>
> > 100000-1000000 стр.
>
> строк или страниц?
> и даже если строк, то что ж это за документища такие???
Это строк. Документища поделал для тестирования
-
Вот, к примеру, как ведет себя notepad++ на таких больших файлах:
1) Что-то ввели - пошел разбор с места ввода, видимая часть экран мгновенно обновилась (перекрасилась)
2) Но если резко проскролить вниз, то заметны хорошие тормоза, пока не досканирует до этого места
Вот в чем вопрос.
-
Но если мы что-то редактируем и никуда далеко не скролим, что зачастую так и бывает, то мы ни о чем и не подозреваем - видимая часть экрана обновляетя мгновенно.
-
Тоже интересовался когда-то для своего проекта, но поскольку у меня требовалось подсветка всего лишь служебных слов (а не каких-то областей), то обошелся однократным сканированием в момент(и параллельно) с загрузкой, дальнейшая обработка шла только в месте редактирования.
Но мне помнится, даже тогда была куча теоретического материала по подсветке.
Если бы сейчас с нуля делал, с подсветкой областей, то в момент загрузки создавал бы еще один "документ", для хранения координат ентих областей и их иерархии.
-
> то в момент загрузки создавал бы еще один "документ", для
> хранения координат ентих областей и их иерархии.
этот "документ" - называется "скелет" который получается в результате сканирования, а в "скелет" вносится текущее состояние автомата и позиция начала состояния в строке. На основании его и красим текст.
Но вопрос то в том, как отсканировать большой кусок текста "незаметно"
-
> Но вопрос то в том, как отсканировать большой кусок текста "незаметно"
непонятно. в отдельном потоке, не?
-
> непонятно. в отдельном потоке, не?
Я если бы знал, как лучше, то не спрашивал бы
-
> если мы что-то редактируем и никуда далеко не скролим,
> - видимая часть экрана обновляетя мгновенно.
ну дык, скелет анализируется в области текущей страницы лишь, с учетом анализа до нее.
-
хотя, если лишь до.. то тоже нехорошо. если у /* в начале документа, */ стоит в конце документа - кака будет.
Значит, надо разбивать обработку на несколько групп. в момент загрузки документа найти всё, что может вот такие большие области означивать. мелочь сканировать в фоне. отображаемую страницу - сразу.
-
> непонятно. в отдельном потоке, не?
Этот вариант тоже буду пробовать
-
Найди исходники Far colorer - он делает то, что тебе надо, мгновенно.
-
Когда я делал редактор с подветкой, то разбор заканчивал на той строке, когда становилось ясно, что подсветка ниже не изменится.
-
> [5] aka © (07.04.17 18:02)
> Но если резко проскролить вниз, то заметны хорошие тормоза,
> пока не досканирует до этого места
В Far так же. Открыл файл 5 Мб не дождался пока конец прокрасится, но сканирование на раскраску редактированию не мешает.
-
> [3] aka © (07.04.17 17:53)
> Разбор достаточно делать с места изменения и до конца, то
> что выше можно не трогать, так что все должно получаться
Так до этого изменения надо же сначала текста всё разобрать, о чём ты сам и пишешь в следующем абзаце.
Ну да, видимо в отдельном потоке надо разбор делать.
-
> [14] Игорь Шевченко © (07.04.17 20:47)
> Far colorer - он делает то, что тебе надо, мгновенно.
Твое сообщение не увидел. В Far 3 colorer по умолчанию входит в комплект, и вродебы тот самый, другого я не помню, но не мгновенно совсем раскрашивает. Конечно 5Мб для исходника программ слишком многовато, но ТС про универсальный редактор спрашивает. Я вот xml открывал только что в Far и это ещё не большой файл.
-
Я бы сделал так.
Изменили текст. Запускается отдельный поток на сканирование. Вместе с этим в основном потоке запускается таймер. В дополнительном потоке используем счётчик-времени. Дополнительном потоке после прохода одной строчке проверяем счётчик времени. Раз в 100 мс обновляем общую структуру с раскраской. А вот основной поток по таймеру периодически проверяет если текущей участок обновился то выводим на экран новые данные. А также проверяем не закончил ли поток работать если закончил отключаем таймер.
Конечно общая структура потребует синхронизации используем Mutex или Lock.
То что данные обновились думаю надо помечать меткой-времени. И соответственно объект Visio(модель MVC) проверяет время своих строк и если меньше то загружает и выводит их на экран.
Короче это почти также как в СУБД с поддержкой версионности данных.
-
> То что данные обновились думаю надо помечать меткой-времени.
А баг при переводи часов назад обзовём фичей.
-
> Pavia © (07.04.17 21:53) [20]
>
> > То что данные обновились думаю надо помечать меткой-времени.
>
> А баг при переводи часов назад обзовём фичей.
Надо работать в часовом поясе UTC+0, тогда никаких переводов часов не будет.