2011-08-04 11 views
1

テキストボックスのテキストをハイライト表示する関数を実行するには(=の左側は赤、=の右側は青)関数を実行する最も良い方法は何ですか?私はCommandTaskスレッドでデータを取得してから、FinishCommand(UIスレッド)で強調表示していたため、うまくいかなかったようですが、ハイライト表示を邪魔している間に少しUIがデッドロックされてしまいました。RichTextBox構文メインスレッドのベストプラクティスからハイライト表示されますか?

したがって、ハイライトコードを特殊なRichTextBox Invoke関数(したがってスレッドセーフ)に配置し、スレッド内で関数呼び出しを移動しようとしました。それも成功しましたが、何らかの理由で4〜8秒遅れていました。これはまったく同じコードなので、私には分かりません。

最後に、スレッド内にリッチテキストテンポラリを作成し、結果のテキストを貼り付けてハイライト表示を試みました。次に、Invoke関数はすべてRTFに沿って実際のRichTextBoxに渡されましたが、何らかの理由でRTFが正しくない場合、その色は毎回2ずつシフトします。例:R =赤、B =青、X =ブラック文字

線1 RRRRXBBBB(正しい)

ライン2 XXRRRRBBB(着色右に2シフト)

ライン3 XXXXRRRRXは(ように右に4シフト、および)

私の最も重要な質問は、どのアプローチが最も優れているのか、正確に同じコードをより遅くスレッドするのはなぜですか、アプローチ3が最善の場合、その奇妙な色シフト。ありがとう!

答えて

3

呼び出しが高価なので時間がかかります。それは2つのスレッドコンテキストスイッチを必要とし、UIスレッドはアイドルでなければならない。強調表示の変更があるたびにこれを行い、スレッドを真剣に動かすことになります。 BeginInvoke()を使うとそれが修正されるはずですが、今度はUIスレッドがうまく動かなくなり、応答しなくなります。言い換えれば、あなたはその戦略で勝つことはできません。

ヘルパーRTBで何が問題になるのかよく分かりません。各行に2つずつオフになっていますが、シンプルなバグのようなにおいがします。ラインの終わりに改行+改行を考慮しないのと同じように。

これをスピードアップするより良い方法は、テキストを強調表示しているときにRTBが更新されないようにすることです。非常に大きな違い。これは組み込みではありませんが、あなたはeasily add itです。あなたの損失を削減することを検討してください、RTBは非常に良いエディタではありません。 ScintillaNETを見てください。

+0

さて、3番目のケースはどうですか?スレッドはRTF文字列を返し、それをRichTextBoxに書き込みます。これはInvokeを必要としません(onFinishはUIスレッドで行われるため)。その場合でもまだ約3-6秒遅い(私はそのバグを修正し、/ r/nは1文字と見なされていたが、2バイトであるため、rtf文字列を投げ捨て、すべてを置き換えた/ r/nと/ r/rとその罰金) – Hershizer33

+0

私は、あなたが私には見えないコードを推測するように頼んでいます。 RTFを再解析する必要があるため、RTFの大きな部分をポンピングするとRTBが遅くなることがあります。 –

+0

良い点は、一緒にいくつかの関連するコードをスクロールし、ペーストビンそれ – Hershizer33

0

典型的なアプローチは、高速な文字列操作(のStringBuilder、にStringWriterなど)を使用してRTF互換の文字列を作成RTF発電機のいくつかの種類を実装して、あなた自身でRichTextBoxコントロールのRTFコードを置き換えることです:

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

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

あなたは基本的に生成する必要があります:

あなたはここでRTF形式のドキュメントを見つけることができます

    あなたは、ワードパッドを使用して試行錯誤を介してこれを行うあなたを強調構文で簡単な文書を作成することができます
  • RTFヘッダー
  • フォント表
  • カラーテーブル
  • 文字テキスト

RTF形式で文書を保存し、メモ帳などのアプリケーションで開き、生成されたRTFを分析します。

このメソッドの利点は、別のスレッドでRTFコードを生成し、コード生成時にユーザーインターフェイスを1回更新できることです。

関連する問題