Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
hrom
Зарегистрирован: 11.05.2005 Сообщения: 2
|
Добавлено: Ср Май 11 2005 19:47 Заголовок сообщения: Подсветка синтаксиса в "текстовых" редакторах |
|
|
Как осуществить быструю подсветку синтаксиса больших текстов ?
Я делаю это в C# с компонентом System.Windows.Forms.RichTextBox так:
richTextBox1.LoadFile("text.txt",RichTextBoxStreamType.PlainText); // загружаю файл в обычном текстовом формате
char []masRtf; // обьявляю массив для текста (в формате RTF)
modRtfText=richTextBox1.Rtf.ToCharArray(); // копирую RTF текст в массив
... // в этом месте я перебираю массив []masRtf и вставляю в нужные мне места теги,
... // определяющие шрифт и цвет текста.
StringBuilder tmp=new StringBuilder(); // это для быстрого
tmp.Append(masRtf); // перевода из (char[]) в (string)
richTextBox1.Rtf=tmp.ToString(); // копирую мною перебраный текст в формате RTF в richTextBox1.Rtf,
// эта операция занимает очень много времени
Как это делают нормальные люди ? |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Чт Май 12 2005 08:39 Заголовок сообщения: события развиваются от плохого к худшему: C->CPP->C# |
|
|
нормальные люди делают это одновременно с загрузкой текста, например, читая текст из файла блоками или построчно
---------------------
события развиваются от плохого к худшему: C->CPP->C# |
|
Вернуться к началу |
|
|
DmitryShm
Зарегистрирован: 17.11.2003 Сообщения: 211 Откуда: Казань
|
Добавлено: Чт Май 12 2005 09:38 Заголовок сообщения: Re: события развиваются от плохого к худшему: C->CPP->C# |
|
|
критикан писал(а): | нормальные люди делают это одновременно с загрузкой текста, например, читая текст из файла блоками или построчно
|
<флейм вырезан модератором> .NET-овский компонент? Почему бы и нет! Просто почитать по нему документацию. Решение построчно и блоками не есть самое лучшее в общем-то. Надо действовать по ситуации. Но если дело только в том, что считать текст, обработать и положить куда надо, то решение, которое предложил критикан подойдет. Но еще наверное критикан имел ввиду, что это следует делать в разных потоках в рамках одного процесса. _________________ love IT |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Пн Май 16 2005 11:07 Заголовок сообщения: не только от плохого к худшему, но и невозможно исправить |
|
|
<флейм вырезан модератором>
>>> .NET-овский компонент? Почему бы и нет! Просто почитать по нему документацию. Решение построчно и блоками не есть самое лучшее в общем-то. Надо действовать по ситуации. Но если дело только в том, что считать текст, обработать и положить куда надо, то решение, которое предложил критикан подойдет. <<<
Вспомним исходный вопрос: как ускорить форматирование читаемого текста? Так как на введении форматирующих тэгов не добиться ускорения, нужно постараться выполнять их во время медленной операции, а это дисковая операция (чтения). Соответственно, нужно вставить форматирование внутрь процедуры чтения. Поскольку компонент чтения файла целиком является для программиста атоммарной функцией, приходится использовать функции блочного (или строчного, но это медленнее) чтения. Вопрос становится таким: что быстрее -- однократное чтение (всего файла) или многократное чтение по кускам? Последнее оказывается более быстрым, так как:
1. преимущество физического однократного чтения перед многократным нивелируется буферированным чтением (а буферированное чтение используется по умолчанию);
2. при однократном чтении требуется большой объём памяти для промежуточного хранения, при многократным -- только память в размере блока, а операция выделения памяти из кучи -- это дорогостоящая по времени операция
>>> Но еще наверное критикан имел ввиду, что это следует делать в разных потоках в рамках одного процесса. <<<
Нет, это я не имел ввиду. Этот способ как раз был бы выгодней для чтения файла не блоками, а целиком: один поток читает, второй форматирует буфер. Но насколько я представляю, во время чтения буфер под считываемые данные блокируется от любого доступа со стороны параллельных процессов (кстати, видимо, поэтому винда до сих пор не научилась обрабатывать данные полноценным конвейером: в конвейере все задействованные программы работают по очереди), но даже если это не так, то возникнут сложности (и, естественно, задержки) с синхронизацией, что делает такой способ просто неинтересным для реализации.
----------------------------------------
не только от плохого к худшему, но и невозможно исправить |
|
Вернуться к началу |
|
|
Wladimir
Зарегистрирован: 02.03.2005 Сообщения: 150 Откуда: Ставропольский край
|
Добавлено: Вт Май 17 2005 19:53 Заголовок сообщения: |
|
|
<флейм вырезан модератором>
Если нет ничего стоящего в исходнике RichEditа, можно ещё глянуть исходники библиотеки KOL ( http://bonanzas.rinet.ru/ ). Там без .Net, чисто для WinApi - но на паскале. |
|
Вернуться к началу |
|
|
Wladimir
Зарегистрирован: 02.03.2005 Сообщения: 150 Откуда: Ставропольский край
|
Добавлено: Вт Май 17 2005 20:22 Заголовок сообщения: |
|
|
Кстати, синтаксическая подсветка актуальна не только при чтении текста из файла, но и по мере ввода. Поэтому идея подсветки по мере считывания неэффективна.
<флейм вырезан модератором>
Цитата: | буферированное чтение используется по умолчанию |
Есть функции как буферизованного, так и небуферизованного чтения.
<флейм вырезан модератором>
Admin: далее буду удалять сообщения целиком. |
|
Вернуться к началу |
|
|
hrom
Зарегистрирован: 11.05.2005 Сообщения: 2
|
Добавлено: Ср Май 18 2005 18:28 Заголовок сообщения: |
|
|
Да именно, это будет редактор, текст программы будет загружатся в редактор и редактироватся там, если пользовались какими нибудь редакторами для программирования вы видели как это работает.
в этих редакторах например вижуал студио и т.п. это мгновенно, я слышал есть какойто класс для этого, посему прожу более конструктивных ответов, считывать поблочно не подходит... |
|
Вернуться к началу |
|
|
Wladimir
Зарегистрирован: 02.03.2005 Сообщения: 150 Откуда: Ставропольский край
|
Добавлено: Ср Май 18 2005 21:47 Заголовок сообщения: |
|
|
Just предположение:
>Так, например, многие текстовые редакторы реализуют синтаксическую "подсветку" именно на основе CRC32, не вызывая при этом коллизий.
http://www.i2r.ru/static/567/out_15878.shtml
Понятно, что речь здесь идёт всего лишь о быстрой идентификации символьных последовательностей.
Видимо, имеется в виду держать в памяти map со встретившимися словами и, беря слова из изменившейся части текста, быстро сверять их с хэш-таблицей ключевых слов и проверять на соответствие заданным правилам.
Соответственно, каждое слово вначале сопоставляется с существующим элементом map. А чем является тот или иной элемент map, и как его подсвечивать, определяется только для (уникальных) элементов map, а не для каждого слова вообще. Соответственно, поскольку большинство слов в программе встречается многократно, число проверок резко сокращается..
По крайней мере, я это представляю так. |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Чт Май 19 2005 14:53 Заголовок сообщения: размеры вопроса и ответа подчиняются правилу 95/5 |
|
|
Таким образом, требуется либо найти класс, являющийся текстовым редактором с подстветкой, либо написать его?
----------------------------
размеры вопроса и ответа подчиняются правилу 95/5 |
|
Вернуться к началу |
|
|
|