首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RichTextBox语法突出显示超出主线程的最佳实践?

RichTextBox语法突出显示超出主线程的最佳实践?
EN

Stack Overflow用户
提问于 2011-08-04 22:06:04
回答 2查看 1K关注 0票数 1

运行语法突出显示文本框中的文本的函数的最佳方式是什么(=的左边是红色,=的右边是蓝色)。我这样问是因为我在一个CommandTask线程中进行了数据检索,然后在FinishCommand (在UI线程中)中进行了高亮显示,这看起来似乎可以工作,但在高亮显示消失的同时会使UI死锁一段时间。

因此,然后我尝试将突出显示的代码放在一个特殊的RichTextBox调用函数中(因此是线程安全的),并将函数调用移动到线程中。这也是有效的,但由于某种原因,它总是慢4-8秒;这对我来说没有任何意义,因为它是完全相同的代码。

最后,我尝试在线程中创建一个临时RichTextBox,将生成的文本粘贴到其中并突出显示。然后,调用函数所做的就是将RTF传递给真正的RichTextBox,但在这种情况下,由于某种原因,RTF不太正确,每次Ex: R=red,B=Blue,X=Black chars时,它的颜色都会偏移2

第1行。RRRRXBBBB (正确)

第2行。XXRRRRBBB (颜色向右移动了2)

行3. XXXXRRRRX (向右移动4,依此类推)

所以,我最主要的问题是哪种方法是最好的,为什么线程化完全相同的代码会更慢,如果方法3是最好的,那么奇怪的颜色变化是怎么回事。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-05 01:06:16

它比较慢,因为调用成本很高。它需要两个线程上下文切换,并且UI线程必须是空闲的。对每一个突出显示的改变都这样做,你会严重地使线程陷入困境。使用BeginInvoke()可以解决这个问题,但现在您将使UI线程陷入停滞状态,使其无法响应。换句话说,你不能用这种策略取胜。

不确定助手RTB出了什么问题。每行减少两个,闻起来像是一个简单的bug。比如不考虑行尾的回车+换行符。

一个更好的加速方法是告诉RTB在你忙于突出显示文本时不要自我更新。差别很大。这不是内置的,但你可以easily add it。考虑减少你的损失,RTB不是一个很好的编辑器。看看ScintillaNET吧。

票数 3
EN

Stack Overflow用户

发布于 2011-08-05 03:08:43

一种典型的方法是实现某种RTF生成器,它使用快速字符串操作(StringBuilder、StringWriter等)构建与RTF兼容的字符串,然后用您自己的代码替换RichTextBox控件的RTF代码:

代码语言:javascript
复制
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 Header
  • 字体表
  • Table
  • Character Text

您可以使用写字板通过反复试验来完成此操作,使用所需的语法突出显示创建一个简单文档,将文档保存为RTF格式,然后在记事本或类似应用程序中打开它,然后分析生成的RTF。

这种方法的好处是,您可以在单独的线程中生成RTF代码,然后在生成代码时只更新用户界面一次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6942867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档