2009-03-18 2 views
2

ストリームから(プロセスによって提供される)文字を1文字ずつ読み込み、それをテキストボックスに追加してユーザーに表示させます。唯一の問題は、です。SLOWです。ユーザーは、プログラムに与えられたとおりにデータを見る必要があります(遅延はほとんどありません)。私は端末がテキストを扱うようなものが好きですが、それは非常に速くスクロールしてぼやけてしまうことがあります。多くの文字を読み込んでテキストボックスを更新する

これを改善するにはどうすればよいですか?

参考までに、私はC#.net3.5とwinformsを使用しています。

答えて

2

テキストボックスのTextプロパティがあります文字列と文字列は不変です(つまり、文字列を変更することはできません)。つまり、文字を追加するたびに、最後に文字が1つ追加された文字列の新しいコピーが作成されます。

たとえば、テキストボックスに10000文字がある場合は、次の文字を追加するために20kBのデータをコピーします。一度に100文字を追加すると、2MBのデータをコピーすることになります。

データが行ベースの場合は、テキストボックスの代わりにリストを使用して、文字を追加するときに最後の行を更新するだけで済みます。

0

ボトルネックが何であるか把握するのに役立つコードがあります。

(私はここでそれをテストすることはできませんように私は、コピー/貼り付けを示唆しています)私はこれらの線に沿って何かをしようと思い、言った:

// Stream s... 
byte[] buffer = new buffet[bufferSize]; 
s.BeginRead(b, 0, buffer.Length, 
    delegate 
     { 
      if (textBox1.InvokeRequired) 
      { 
       textBox1.Invoke(
        new MethodInvoker(
         delegate 
         { 
          textBox1.Text = Encoding.Unicode.GetString(b); 
         })); 
      } 
      else 
      { 
       textBox1.Text = Encoding.Unicode.GetString(b); 
      } 
     }, null); 
1

複数行のテキストボックスでは、あなたが文字を追加するために選択を使用して、わずかに良いパフォーマンスが得られます:

textBox1.Select(textLength, 0); 
textBox1.Selectedtext = newText; 
textLength += newText.Length; 

しかし、あなたは長さを自分で追跡する必要がありますし、この方法はおそらく壊れる見ることができるようにcontrol-chars(バックスペースのような)を許可した場合。

まず、リストボックスを使用するというGuffaの考えをお勧めします。

関連する問題