2011-08-04 69 views
1

什麼是運行語法高亮顯示文本框中文本的函數的最佳方式(左側= =紅色,右側=藍色)。我問,因爲我有一個CommandTask線程中的數據檢索,然後在FinishCommand(在UI線程中)突出顯示,這似乎工作,但會突然死鎖用戶界面一點點,而突然離開突出顯示。RichTextBox語法突出顯示主線程的最佳做法嗎?

因此,我嘗試將突出顯示的代碼放入一個specTerative RichTextBox Invoke函數(從而線程安全),並移動線程中的函數調用。這也行得通,但由於某種原因,持續4-8秒慢;這對我來說沒有意義,因爲它具有完全相同的代碼。

最後,我嘗試在線程中創建一個臨時的RichTextBox,將生成的文本粘貼到它並突出顯示。然後,所有Invoke函數都會將RTF傳遞給真正的RichTextBox,但在這種情況下,由於某種原因,RTF不太正確,每次都將顏色移動2次:R = red,B = Blue中,X =黑色字符

行1. RRRRXBBBB(正確)

線路2 XXRRRRBBB(着色移位2向右)

線3. XXXXRRRRX(移位4到右側,等)

所以,我的首要問題是哪種方法是最好的,爲什麼線程化完全相同的代碼較慢,如果方法3是最好的,那麼最奇怪的顏色是什麼移動。謝謝!

回答

3

由於調用較爲昂貴,所以速度較慢。它需要兩個線程上下文切換,並且UI線程必須閒置。爲每一個突出顯示的變化做到這一點,你會嚴重阻礙線程。使用BeginInvoke()可以解決這個問題,但現在你會陷入用戶界面線程,因此無法響應。換句話說,你不能用這個策略獲勝。

不知道助手RTB出了什麼問題。它每行有兩個,聞起來像一個簡單的bug。就像在行尾沒有考慮回車+換行一樣。

提高速度的更好方法是告訴RTB在忙於突出顯示文本時不要自行更新。非常大的差異。這不是內置的,但你可以easily add it。考慮減少你的損失,RTB不是一個很好的編輯器。看看ScintillaNET

+0

那麼,第三種情況呢?線程返回一個RTF字符串,並將其寫入RichTextBox,它不需要Invoke(因爲onFinish發生在UI線程中)。即使在這種情況下,它的速度仍然只有3-6秒左右(我也修正了這個錯誤,但是必須處理這樣一個事實,即/ r/n被認爲是1個字符,但是是2個字節,因此拋棄了rtf字符串,/r/n與/ r/r及其罰款) – Hershizer33

+0

我不知道,你要求我猜我看不到的代碼。因爲RTB必須重新解析RTB,所以當你將一大塊RTF加入時,RTB可能會很慢。 –

+0

好點,一起討論一些相關代碼和Pastebin吧 – Hershizer33

0

一個典型的方法是實現某種RTF發電機,使用快速字符串操作(StringBuilder的,StringWriter的,等等)構建一個RTF兼容的字符串,然後用自己取代RichTextBox控件的RTF代碼:

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頭
  • 字體表
  • 顏色表
  • 字符文本

您可以通過使用寫字板做到這一點通過試錯,創建一個簡單的文檔與語法高亮你希望將文檔保存爲RTF格式,然後在記事本或類似應用程序中打開它,然後分析生成的RTF。

效益這種方法的是,可以產生在一個單獨的線程的RTF代碼,然後生成的代碼時只有一次更新用戶界面。