Конференция "Прочее" » Редактор с подсветкой
 
  • aka © (07.04.17 17:12) [0]
    Приветствую товарищи. Сейчас занимаюсь разработкой текстового редактора с подсветкой синтаксиса. Проблемка в том, что при вводе текста нужно
    запускать текст на пересканировку. На относительно не больших файлах (до 10000 стр) все работает не заметно, а вот как быть при больших...
    100000-1000000 стр. нажимаешь клавишу и ждешь 1-2 сек пока программа отвиснет.
    У меня для сканирования определена отдельная функция, где этот текст прогоняется циклом от начала до конца.

    Правильнее, наверное, было бы так:
    1) при каждом изменении текста(ввод\вставка из буфера) обновить сражу же видимую часть экрана (чтобы пользователь ничего не заметил),
    а все остальное "потихоньку" досканировать
    2) если предыдущее сканирование не закончено, а пользователь что-то ввел, то оборвать предыдущее сканирование и начать новое.

    Но пока не думал как это реализовать, можно ли будет обойтись без таймера?

    Может кто когда писал такое? Помогите советом.
  • Inovet © (07.04.17 17:21) [1]
    > [0] aka ©   (07.04.17 17:12)

    Только видимое на экране вряд ли получится, надо же разбор всего текста делать. С изменением теста уже проще, тут полный переразбор не нужен, достаточно в разобранном изменять.
  • kilkennycat © (07.04.17 17:42) [2]

    > 100000-1000000 стр.

    строк или страниц?
    и даже если строк, то что ж это за документища такие????
  • aka © (07.04.17 17:53) [3]

    >
    > Только видимое на экране вряд ли получится, надо же разбор
    > всего текста делать.

    Разбор достаточно делать с места изменения и до конца, то что выше можно не трогать, так что все должно получаться


    > С изменением теста уже проще, тут полный переразбор не нужен,
    >  достаточно в разобранном изменять.

    Ну, к примеру, ввели одинарную или двойную кавычку и строки стали не строками, а то что было строкой может быть названием функции или переменной, так что пересканировать нужно будет все равно все.
  • aka © (07.04.17 17:55) [4]

    > kilkennycat ©   (07.04.17 17:42) [2]
    >
    >
    > > 100000-1000000 стр.
    >
    > строк или страниц?
    > и даже если строк, то что ж это за документища такие???

    Это строк. Документища поделал для тестирования
  • aka © (07.04.17 18:02) [5]
    Вот, к примеру, как ведет себя notepad++  на таких больших файлах:
    1) Что-то ввели - пошел разбор с места ввода, видимая часть экран мгновенно обновилась (перекрасилась)
    2) Но если резко проскролить вниз, то заметны хорошие тормоза, пока не досканирует до этого места

    Вот в чем вопрос.
  • aka © (07.04.17 18:05) [6]
    Но если мы что-то редактируем и никуда далеко не скролим, что зачастую так и бывает, то мы ни о чем и не подозреваем - видимая часть экрана обновляетя мгновенно.
  • Kilkennycat © (07.04.17 18:48) [7]
    Тоже интересовался когда-то для своего проекта, но поскольку у меня требовалось подсветка всего лишь служебных слов (а не каких-то областей), то обошелся однократным сканированием в момент(и параллельно) с загрузкой, дальнейшая обработка шла только в месте редактирования.
    Но мне помнится, даже тогда была куча теоретического материала по подсветке.
    Если бы сейчас с нуля делал, с подсветкой областей, то в момент загрузки создавал бы еще один "документ", для хранения координат ентих областей и их иерархии.
  • aka © (07.04.17 19:04) [8]

    > то в момент загрузки создавал бы еще один "документ", для
    > хранения координат ентих областей и их иерархии.

    этот "документ" - называется "скелет" который получается в результате сканирования, а в "скелет" вносится текущее состояние автомата и позиция начала состояния в строке. На основании его и красим текст.

    Но вопрос то в том, как отсканировать большой кусок текста "незаметно"
  • Kilkennycat © (07.04.17 19:15) [9]

    > Но вопрос то в том, как отсканировать большой кусок текста  "незаметно"

    непонятно. в отдельном потоке, не?
  • aka © (07.04.17 19:18) [10]

    > непонятно. в отдельном потоке, не?

    Я если бы знал, как лучше, то не спрашивал бы
  • Kilkennycat © (07.04.17 19:19) [11]

    >  если мы что-то редактируем и никуда далеко не скролим,
    > - видимая часть экрана обновляетя мгновенно.

    ну дык, скелет анализируется в области текущей страницы лишь, с учетом анализа до нее.
  • Kilkennycat © (07.04.17 19:24) [12]
    хотя, если лишь до.. то тоже нехорошо. если у /* в начале документа,  */ стоит в конце документа - кака будет.
    Значит, надо разбивать обработку на несколько групп. в момент загрузки документа найти всё, что может вот такие большие области означивать. мелочь сканировать в фоне. отображаемую страницу - сразу.
  • aka © (07.04.17 19:25) [13]

    > непонятно. в отдельном потоке, не?

    Этот вариант тоже буду пробовать
  • Игорь Шевченко © (07.04.17 20:47) [14]
    Найди исходники Far colorer - он делает то, что тебе надо, мгновенно.
  • Dimka Maslov © (07.04.17 20:52) [15]
    Когда я делал редактор с подветкой, то разбор заканчивал на той строке, когда становилось ясно, что подсветка ниже не изменится.
  • Inovet © (07.04.17 20:53) [16]
    > [5] aka ©   (07.04.17 18:02)
    > Но если резко проскролить вниз, то заметны хорошие тормоза,
    > пока не досканирует до этого места

    В Far так же. Открыл файл 5 Мб не дождался пока конец прокрасится, но сканирование на раскраску редактированию не мешает.
  • Inovet © (07.04.17 20:57) [17]
    > [3] aka ©   (07.04.17 17:53)
    > Разбор достаточно делать с места изменения и до конца, то
    > что выше можно не трогать, так что все должно получаться

    Так до этого изменения надо же сначала текста всё разобрать, о чём ты сам и пишешь в следующем абзаце.

    Ну да, видимо в отдельном потоке надо разбор делать.
  • Inovet © (07.04.17 21:05) [18]
    > [14] Игорь Шевченко ©   (07.04.17 20:47)
    > Far colorer - он делает то, что тебе надо, мгновенно.

    Твое сообщение не увидел. В Far 3 colorer по умолчанию входит в комплект, и вродебы тот самый, другого я не помню, но не мгновенно совсем раскрашивает. Конечно 5Мб для исходника программ слишком многовато, но ТС про универсальный редактор спрашивает. Я вот xml открывал только что в Far и это ещё не большой файл.
  • Pavia © (07.04.17 21:47) [19]
    Я бы сделал так.
    Изменили текст. Запускается отдельный поток на сканирование. Вместе с этим в основном потоке запускается таймер.  В дополнительном потоке используем счётчик-времени. Дополнительном потоке после прохода одной строчке проверяем счётчик времени. Раз в 100 мс обновляем общую структуру с раскраской. А вот основной поток по таймеру периодически проверяет если текущей участок обновился то выводим на экран новые данные. А также проверяем не закончил ли поток работать если закончил отключаем таймер.
    Конечно общая структура потребует синхронизации используем Mutex или Lock.
    То что данные обновились думаю надо помечать меткой-времени. И соответственно объект Visio(модель MVC) проверяет время своих строк и если меньше то  загружает и выводит их на экран.

    Короче это почти также как в СУБД с поддержкой версионности данных.
 
Конференция "Прочее" » Редактор с подсветкой
Есть новые Нет новых   [134431   +10][b:0][p:0.001]