-
Приветствую товарищи. Сейчас занимаюсь разработкой текстового редактора с подсветкой синтаксиса. Проблемка в том, что при вводе текста нужно запускать текст на пересканировку. На относительно не больших файлах (до 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) проверяет время своих строк и если меньше то загружает и выводит их на экран.
Короче это почти также как в СУБД с поддержкой версионности данных.
|