2010-12-28 3 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

@Wonko 동의, 그들은 직관적이지 않습니다. 온라인 게시 목적으로 난독 화되기를 바랍니다. – AaronLS

답변

7

코드를 다시 작성하여 BackgroundWorker 클래스를 사용하는 것이 좋습니다.

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

이, 더 쉽게 ProgressChanged 이벤트

+0

이것은 아주 좋은 출발점이지만 때로는 backgorundworker와 비슷한 클래스를 만들지 만, 내 자신의 이벤트 및 이벤트 args 클래스를 선언하여 이벤트 인수에 강력한 형식의 진행률 클래스를 만들 수 있습니다. – AaronLS

+0

@AaronLS 좋은 충고, 나는 또한 똑같은 일을하고 스레드가 완료되면 스스로 처리하는 클래스의 인스턴스를 많이 만듭니다. –

0

또 다른 방법은을 사용하여 사용자 인터페이스를 업데이트 할 수 있도록 대의원을 사용하여 진행 BAAR 기능으로 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); 
     } 
    } 
관련 문제