RichTextBox Подсветка синтаксиса из лучшей практики основного потока? - PullRequest
1 голос
/ 04 августа 2011

Какой лучший способ запустить функцию, синтаксис которой выделяет текст в текстовом поле (слева от = красный, справа от = синий). Я спрашиваю, потому что у меня было извлечение данных в потоке CommandTask, а затем было выполнено выделение в FinishCommand (в потоке пользовательского интерфейса), и это, похоже, сработало, но немного заблокировало бы пользовательский интерфейс, в то время как выделение выделилось.

Итак, я попытался поместить код подсветки в специальную функцию RichTextBox Invoke (таким образом, потокобезопасный) и переместил вызов функции в поток. Это также сработало, но по какой-то причине было на 4-8 секунд медленнее; это не имеет смысла для меня, потому что это точно такой же код.

Наконец, я попытался создать временный RichTextBox в потоке, вставить полученный текст и выделить его. Затем все, что делала функция Invoke, это передавали RTF к реальному RichTextBox, но в этом случае по какой-то причине RTF не совсем правильный, его цвет смещается на 2 каждый раз, например: R = красный, B = синий , X = черные символы

Строка 1. RRRRXBBBB (правильно)

Строка 2. XXRRRRBBB (раскраска смещена на 2 вправо)

Строка 3. XXXXRRRRX (смещено на 4 вправо и т. Д.)

Итак, мой общий вопрос: какой подход лучше, почему потоковая обработка одного и того же кода медленнее, а если подход 3 лучший, что происходит с этим странным изменением цвета. Спасибо!

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

Это медленнее, потому что вызов стоит дорого.Это требует двух переключателей контекста потока, и поток пользовательского интерфейса должен быть бездействующим.Делайте это для каждого изменения подсветки, и вы будете серьезно увязать в теме.Использование BeginInvoke () исправило бы это, но теперь вы будете перегружать поток пользовательского интерфейса, чтобы он не отвечал.Другими словами, вы не можете выиграть с этой стратегией.

Не уверен, что не так с вспомогательным RTB.Он выключен на две для каждой строки, пахнет как простая ошибка.Как не учитывать возврат каретки + перевод строки в конце строки.

Лучший способ ускорить это - сказать RTB не обновляться, когда вы заняты выделением текста.Очень большая разница.Это не встроено, но вы можете легко добавить его .И подумайте о сокращении ваших потерь, RTB просто не очень хороший редактор.Посмотрите на ScintillaNET .

0 голосов
/ 04 августа 2011

Типичным подходом является реализация какого-либо генератора RTF, который создает RTF-совместимую строку с использованием быстрой обработки строк (StringBuilder, StringWriter и т. Д.), А затем заменяет код RTF элемента управления RichTextBox своим собственным:

string rtf = /* Generate RTF code based on original text */
richTextBox.Rtf = rtf; // Replace text box's RTF code

Документацию по формату RTF вы можете найти здесь:

http://msdn.microsoft.com/en-us/library/aa140277%28v=office.10%29.aspx

В основном вам потребуется сгенерировать:

  • Заголовок RTF
  • Таблица шрифтов
  • Таблица цветов
  • Текст символов

Вы можете сделать это методом проб и ошибок с помощью Wordpad, создать простой документ сСинтаксическая подсветка, которую вы хотите, сохранить документ в формате RTF, а затем открыть его в Блокноте или аналогичном приложении, а затем проанализировать сгенерированный RTF.

Преимущество этого метода заключается в том, что вы можете генерировать код RTF в отдельномкогда код генерируется, обновите пользовательский интерфейс только один раз.

...