我要做一个数据库复制程序,在winform中,执行时间用进度条显示,用线程控制进度条显示状态
.........
private System.Windows.Forms.ProgressBar progressBar1;  //进度条
private System.Windows.Forms.Label Lab_percent;        //显示完成百分比
private Thread myThread;private void start()
{
while(isStart())
{
    Thread.Sleep(100);
             if(this.progressBar1.Value < this.progressBar1.Maximum)
    {
           Lab_percent.Text = "完成 "+ this.progressBar1.Value +"%";
                    this.progressBar1.Value +=1;
              }
}
         Lab_percent.Text = "完成100%";
         this.progressBar1.Value = 100;
this.button2.Text = "完 成";
}private bool isStart()
{
         //数据库是否在复制中
........
}private void SettingDatabase()
{
     this.myThread.Start();
     //复制数据库操作
     ...............
}
//执行复制数据库
private void button1_Click(object sender, System.EventArgs e)
{
this.myThread = new Thread(new ThreadStart(start));
SettingDatabase();
}
private void button2_Click(object sender, System.EventArgs e)
{
try
{
if(myThread.IsAlive)
      myThread.Abort();
}
catch{}
this.Close();
}可是在执行过程中看不到进度条的显示状态,
我在下面地址中的文章中了解到progressBar1和Lab_percent是UI线程中的控件,但不知道怎么用才能
http://dev.csdn.net/article/18/18280.shtm
请高手帮我解析源码,谢谢

解决方案 »

  1.   

    把ProgressBar 控件作为参数传入到线程中去。
      

  2.   

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnforms/html/winforms08162002.asp
      

  3.   

    你忘了打开线程了吧!
    private void button1_Click(object sender, System.EventArgs e)
    {
    this.myThread = new Thread(new ThreadStart(start));
    this.myThread.Start();
    SettingDatabase();
    }
      

  4.   

    不要在创建控件以外的线程操作控件,使用Control的Invoke方法,将操作放到UI线程上。private void Form1_Load(object sender, System.EventArgs e)
    {
        System.Threading.Thread tNew = new System.Threading.Thread    (new     System.Threading.ThreadStart(this.Test));
        tNew.Start();
    }delegate void SetProgressDelegate();private void SetProgress()
    {
       if(this.progressBar1.Value < this.progressBar1.Maximum)
        {
               Lab_percent.Text = "完成 "+ this.progressBar1.Value +"%";
                        this.progressBar1.Value +=1;
                  }
    }private void Test()
    {
       this.Invoke(new SetProgressDelegate(SetProgress));
    }