2009-06-01 8 views
1

私のアプリケーションはマルチスレッドでf.ex 25のアクティブなスレッドを持ち、各スレッドはステータスをデリゲートによってリストアイテムにプッシュします。ListView - 瞬きを避ける方法(.NET/C#)?

例:状況に応じて、

private delegate void SetBackColorDelegate(int index, Color color); 
    private void SetBackColor(int index, Color color) 
    { 
     if (listView1.InvokeRequired) 
     { 
       listView1.Invoke(new SetBackColorDelegate(SetBackColor), new object[] { index, color }); 

     } 
     else 
     { 
       listView1.Items[index].BackColor = color; 
     } 
    } 

それはアイテムの色等を変更し、それは多くのことを瞬い、それはたぶん、あなたはこれを回避する方法を提案することができます:)

非常に厄介に見えますか?描画をスピードアップするには?あるいは、私はいくつかの異なるコンポーネントを使い始めてみるべきでしょうか?

+0

私はあなたがちらちらを意味すると思う。 –

+0

問題を少しでも拡大できますか?アイテムの色を変更するスレッドがたくさんありますが、色が大きく変わるという問題がありますか?ダブルバッファリングのようなちらつきや、色の変化が十分に速くなく、常に後ろを追っていて、常に色を変えようとしているのですか?私は、コードがアイテムの色を変更する要求を出してから、色が変わるのがなぜ問題なのか分かりません。 –

答えて

2

私のコメントへのあなたの応答を待っている間。 ダブルバッファリングの問題である場合、this questionからの受け入れられた答えがあなたを得るでしょう。答えのスタイルを使用するようにリストビューを設定して、あなたは良いです。これは、カラー更新がモニタのリフレッシュレート(通常は毎秒約60回)に同期することを確実にしますが、更新がモニタのリフレッシュ間にある場合に発生するフリッキング/ティアリングを停止させるので、パフォーマンス上の不利益があります。

+0

ありがとうございました。本当にthis http://stackoverflow.com/questions/76993/how-to-double-buffer-net-controls-on -a-formは私を助けました:) –

1

各スレッドを共有データ構造にプッシュし、タイマーを使用してUIスレッドから1秒に1回ポーリングすることを検討してください。その方法は:

  • あなたは非UIスレッドから呼び出すことを心配する必要はありません
  • あなたはまだ合理的にアップツーになるだろう「忙しい」UI
  • を取得することはできません
  • (最近更新された場合は更新しないでください)

効率性の面ではUIタイマーについてよく分かりません。そのようなタイマーは比較的コストがかかる可能性があります、あなたはかもしれませんは、とにかくクロススレッド通信を持つ必要があります:タイマーを有効にしていない場合はタイマーを有効にし、更新を行う場合はタイマーを無効にしてください。そうすれば、あなたは常に現実の背後にあるのですが、1秒間に1つの状態更新しかありません。

+0

ええ、それは簡単に行うことができます。しかし、私は即座のステータスが必要です;)それは問題です、私は1秒ごとにそれを行うことができますが、私はできません。 –

+0

矛盾した要件があるように聞こえます。何かを瞬時に更新する必要がある場合、表示する更新がたくさんある場合、画面にはすべての更新が表示され、ちらつきの影響があります。 –

+0

(これは本当にダブルバッファリングの場合は、私は問題を誤解しています - おっと) –

関連する問題