2012-04-01 9 views
0

チャレンジ:私の簡単なチャレンジのためのスレッド/独立実行?

私のフォームには14個のラベルと、100ms間隔で連続して動作するタイマーが含まれています。タイマー内には、ファイルシステムとインターフェースし、特定のファイルの存在をチェックするコードがあります。このファイルが存在するかどうかによって、単純に真または偽になり、条件が満たされなくなると、ラベルの背景色が灰色から赤色に変わり、次に灰色に変わります。

これまでOKです。私はそれを問題なくプログラムすることができ、それは動作します。

このフォームには、いつでもクリックする必要のあるいくつかのボタンがあります。しかし、フォームが占有されているようにユーザーエクスペリエンスを感じさせる遅れがあります。私はこれを推測しているのは、タイマーがUIを更新する必要があるため、クリックリクエストに完全に集中することができないためです。私はITサポートのバックグラウンドから来て、OOPとC#.NETのグリップに夢中になっています:)私は、スレッド/独立実行の基本やその他のものを把握するのに役立つ簡単な例を探しています。長期的な可能性があります。そこに多くの例があることを感謝しますが、あなたのうちの1人は、私のアプリケーションの文脈の中で私がする必要があるかもしれないことをアドバイスしてくれますか?

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      timer1.Start(); 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      if (System.IO.File.Exists("C:\file.txt") == true) 
      { 
       label1.BackColor = System.Drawing.Color.Red; 
       //label2.BackColour.. 
       //label3.BackColour.. 
       //..     
      } 
      if (System.IO.File.Exists("C:\file.txt") == false) 
      { 
       label1.BackColor = System.Drawing.Color.Gray; 
       //label2.BackColour.. 
       //label3.BackColour.. 
       //..     
      } 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      //Do something 
     } 
    } 
} 
+0

正確に何が問題ですか? – svick

+0

@svick私はそれがデザインのものだと思っています。ネイサンは挑戦、新しい技術のためにあなたですか? – NSGaga

+0

確かに、いつも試してみてください。 –

答えて

2

タイマーのファイルをポーリングする代わりにFileSystemWatcherを使用してください。

+0

+1これは正確に何をするかです。ファイルが検出されたら、ボタンを使って色を変更するかどうかを判断します。レイテンシに惑わされず、CPUを浪費するGUIフリーズポーリングはありません。 –

0

FileSystemWatcherは、デビッド・ネルソンによって提案されたが、これは迅速で(非常に)汚いやり方で、より良いオプションです:

public partial class Form1 : Form 
{ 
    private System.Threading.Timer timer1; 

    public Form1() 
    { 
     InitializeComponent(); 

     this.timer1 = new System.Threading.Timer(state => { 
      var fileExists = System.IO.File.Exists(@"C:\file.txt"); 

      this.BeginInvoke(new Action(() => { 
       if (fileExists) { 
        label1.BackColor = System.Drawing.Color.Red; 
        //label2.BackColour.. 
        //label3.BackColour.. 
        //..     
       } 
       else { 
        label1.BackColor = System.Drawing.Color.Gray; 
        //label2.BackColour.. 
        //label3.BackColour.. 
        //..     
       } 
      })); 
     }, null, 0, 100); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

    } 
} 
+0

System.Threading.TimerはThreadPoolスレッド上でデリゲートを呼び出します。つまり、UI以外のスレッドのコントロールにアクセスして例外をスローします。 –

+0

私はこのコードを.NET FW 4をターゲットとするWinFormsプロジェクトのVS11で実行しようとしました。私はそれが例外をスローすることを知っているが、それはしなかった。 –

+0

バックグラウンドスレッドからBackColorを確実に設定できます。ただし、これはいつでも変更可能な実装の詳細です。 WinFormsコントロールの任意のプロパティをバックグラウンドスレッドから設定することはできません。 –

関連する問題