2010-12-28 5 views
1

私のプログラム中にプログレスバーを表示したいのですが、いくつかの機能が実行されています。この関数は、ユーザーがbutton1をクリックすると実行されます。私はバックグラウンドで実行されているトレッドを使用しましたが、私のプログラムでは、このスレッドはこの機能を実行した後に実行されています。どうすれば修理できますか?バックグラウンドでスレッドC#

private void button1_Click(object sender, EventArgs e) 
{ 
    pr(sender,e); 
} 

public void pr(object sender, EventArgs e) 
{ 
    if (... == DialogResult.OK) 
    { 
     if (...) 
     { 
      Thread wa = new Thread(new ThreadStart(this.lad)); 
      wa.IsBackground = true; 

      timer1.Interval = 500; 
      timer1.Start(); 
      wa.Start(); 

      if (... == DialogResult.OK) 
      {//the rest of the function} 
     } 
    } 
} 

private void lad() 
{ 
    int war = 10; 

    if (this.progressBar1.InvokeRequired) 
    { 
     progressBar1.Invoke((Del)delegate 
     { 
      for (int i = 1; i <=10; i++) 
      { 
       this.progressBar1.Value = this.progressBar1.Value + war; 
      } 
     }); 
    } 
    if (progressBar1.Value == progressBar1.Maximum) 
    { 
     timer1.Stop(); 
     MessageBox.Show("files saved"); 
    } 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    ladowanie_paska(); 
} 
+0

私はこれらの変数と関数名が....何かを意味すると思いますか?誰もこれを維持しなくていいと思っています。 –

+0

@ワンコ合意、彼らは直感的ではありません。オンライン投稿の目的で難読化されることを祈っています。 – AaronLS

答えて

7

BackgroundWorkerクラスを使用するようにコードを書き直すことを強くお勧めします。

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

これは、それが簡単にProgressChangedイベント

+0

これは素晴らしいスタートですが、私は自分のクラスをbackgorundworkerと似ていることがありますが、自分自身のイベントとイベントargsクラスを宣言して、イベント引数に厳密に型指定されたプログレスクラスを持たせることができます。 – AaronLS

+0

@AaronLS良いアドバイス、私は同じことをして、スレッドが完了したときに自己破棄するそのクラスのインスタンスをたくさん作成します。 –

0

別の方法があるを使用して、ユーザーインターフェイスを更新するために作るデリゲートを使用して進捗バールの機能を使用してporcessを実行しているのと同じデリゲートをマルチキャストします。 以下のコードには、同じ種類の機能があります。

private void BtnWatch_Click(object sender, EventArgs e) 
    { 
     tickerDelegate1 = new TickerDelegate(SetLeftTicker); 
     Thread th = new Thread(new ThreadStart(DigitalTimer)); 
     th.IsBackground = true; 
     th.Start(); 

    } 
    private void SetLeftTicker() 
    { 

     label2.Text=DateTime.Now.ToLongTimeString(); 
    } 


    public void DigitalTimer() 
    { 
     while (true) 
     { 
      label2.BeginInvoke(tickerDelegate1, new object[] {}); 
      Thread.Sleep(1000); 
     } 

    } 

    private void BtnProgrss_Click(object sender, EventArgs e) 
    { 
     // progressBar1.Visible = true; 

     if (_flag == true) 
     { 
      tickerDelegate1 += new TickerDelegate(AnimateProgBar); 
      _flag = false; 
     } 
    } 

    private void AnimateProgBar() 
    { 

     num += 5; 
     if (num >= 100) 
     { 
      num = 0; 
     } 
     progressBar1.Value = num; 
    } 

    private void SetProgressBar() 
    { 

     while (true) 
     { 

      progressBar1.Invoke(tickerDelegate1, new object[] { }); 
      //Thread.Sleep(10); 
     } 
    } 
関連する問題