2012-04-16 8 views
1

を更新しないバインドiListというDGVは、私は簡単なテストクラスを持っている

 TEST_CLASS n = new TEST_CLASS(); 
     MY_CLASS.Add(n); 


     grid_nodes.DataSource = MY_CLASS; 

     Thread t = new Thread(set1); 
     t.Start(); 

     Thread t2 = new Thread(set2); 
     t2.Start(); 

とスレッドその更新テスト目的のクラスのランダム値:

public void set1() 
    { 
     while (true) 
     { 
      Random r = new Random(); 
      MY_CLASS[0].IP = r.Next(999900); 
      Thread.Sleep(100); 
     } 
    } 

    public void set2() 
    { 
     while (true) 
     { 
      Random r = new Random(); 
      MY_CLASS[0].PORT = r.Next(999900); 
      Thread.Sleep(100); 
     } 
    } 

問題は、DGVが正しく更新されていないことです。私は、セル内をクリックするたびに更新を見るだけです。

私は何千もの行を持ち、MY_CLASSを更新する別々のスレッドを持っているので、DGVに 'live'と表示されるように変更する必要があります。

私の知る限り、クラスを更新するたびにDGV.Update()を呼び出す必要がありますか?私はクラスを絶えず更新している何千ものスレッドを持っているので、これを行う最良の方法は何でしょうか?ありがとう!

+0

'何千ものスレッドが絶えずクラスを更新しています 'というのは面倒ですが、クラスがスレッドセーフであることは確かですか? –

+0

@JoshuaDrakeあなたが何を意味するかわからない、おそらくないだろう。リスト内の変数を持つ単純なクラスです。私はこれについてもっと知ることができるところを教えてくれますか?また、私が探しているのは、私が達成しようとしていることをする単純なコード例ですが、何も見つけられないようです。これは本当に達成すべき課題の「リア」ですか?ありがとうございました – user1015551

+1

[Thread Synchronization in C#](http://www.albahari.com/threading/part2.aspx)、[Thread-Safe Collections](http://msdn.microsoft.com/en-us) /library/dd997305.aspx)をC#で実行します。 –

答えて

0

あなたの代わりに、リストのBindingListを使用している場合に、そしてあなたはtest_classはINotifyPropertyChangedを実装します、グリッドが自動的に更新されます。しかし、UIスレッド上で何らかの形式のマーシャリング(SynchronizationContextやgrid. Invoke()など)によってのみ確実に行う必要があります。

2

[OK]を、ので、私は単純にタイマーに次のコードを追加し、それは素晴らしい作品これは、いくつかの条件でトリガします:

  grid.DataSource = null; 
      grid.DataSource = MY_LIST; 
      grid.Invalidate(); 
+1

同期を行わずにこの操作を行うと、クロススレッド例外が発生します。 UIスレッドのみがグリッドを更新する必要があります。 grid.Invoke()でこれを行うことを確認してください。 –

関連する問題