2011-11-11 11 views
1

RichTextBoxから15.000(もっと多くの可能性があります)行が届きました。各行に値を追加する必要があります。 これを行う最善の方法は、プログラムがロックアップしないようにすることですか?Cで大きなテキストを処理しています

Thread th1 = new Thread(Process); 
th1.Start(); 

をそれはまだ固まっ:次に

public void Process() 
     { 

       string[] lines; 
       string line; 
       string foo = " baa"; 
       if (richTextBox1.InvokeRequired) 
       { 

        lines = (string[])Invoke((ReadLines)delegate 
        { 
         return /* read .Lines[] from richTextBox1 */ 
        }); 
        int max = lines.Length; 

        for (int i = 0; i < max; i++) 
        { 
         line = lines[i]; 
         if (..) 
         { 
          lines[i] += "foo"; 
         } 
        } 

        Invoke((Update)delegate 
        { 
         /* set new lines to RichTextBox1 */ 
        }); 

       } 
     } 

とを:

現在、私はスレッドとして実行されているループ内の行を処理しています。これを行う最善の方法は何ですか? ありがとうございます。

+1

これは残念なことに、獣の性質です。リッチテキストボックスコントロールは、その数行を保持するためのものではなく、割り当てによってUIがロックされます。私は "回避策"の代わりに "再設計"と考えるだろう – BrokenGlass

+0

うん。追加することを前提としていますが、最後にテキストボスは作成されていません。商用/校正エディタコンポーネントを入手してください。 – TomTom

答えて

0

ご迷惑をおかけしますが、テキストボックスを使用するのではなく、部分的な更新と大量のテキストの処理を目的としたエディタコンポーネント(たとえばSyntaxEdit)を使用することをお勧めします。 UIはあなたの処理のためにロックアップされませんが、大文字のテキストボックスではテキストボックスが非効率で、更新中にテキストボックスがUIスレッドをブロックするだけであるためです。それを書き直さなければ動作しません。あなたはそれのための仕様よりも14.900行も大きいと言います。ボックス内のテキストを更新するたびに、実際には遅い再描画サイクルが開始されます。あなたが中断することはできないので、すべてのスレッドは助けられません - UIがこの更新サイクルが終了するまで応答しないためです。

「実際のテキストエディタ」には、はるかに大きなテキストを処理するための他のコンポーネントも用意されています。

+0

RichTextBoxを使用した別のソリューションはありませんか?それは何かをハイライトする必要があるからです。 –

+0

SyntaxEditをチェックしてください - 商業、お金、プログラマー(ハイライトなど)のためのエディターコンポーネント、大きなファイルを扱うためのbleコンポーネント。 – TomTom

1

BackgroundWorker controlを試してください。

+0

-1。更新が既に別のスレッドで起こっている可能性があるため、問題を処理する可能性は非常に低いです(呼び出しに見られるように)。バックグラウンドワーカーは、テキストボックスを取る極端な長い更新時間を処理しません。この間、UIはロックされます。 – TomTom

-1

進捗状況を示すBackgroundWorkerで実行することは、リッチテキストボックスを使用する必要がある場合は、最善の方法です。これらのAJAX画像を回転させる人でも十分です。

+0

-1。表示は素晴らしいですが、ポスターが特に求めている問題(UIがロックアップ)を処理することはありません。 – TomTom

関連する問題