简单的说,在一个窗口里有个按钮,按下这个button,是个循环,很长很长的循环,估计得1小时以上举例:
for (i=0;i<=10000000;i++)
{
    XXXXXXXXXXXXXXXXXX;
    ......
}里面的运算比较复杂,所以循环很长时间我想让程序能显示运行到哪一步了,比如能显示一下i这个值,但程序改成:
for (i=0;i<=10000000;i++)
{
    label1.Text=i.ToString();
    XXXXXXXXXXXXXXXXXX;
    ......
}并不能随时显示i,而是要等循环全部完成才显示最后一个i值。应该如何做?

解决方案 »

  1.   

    不是不能显示,而是界面抽住了吧?把这个i通过多线程显示在label上看看
      

  2.   

    使用BackgroundWorker用法可以解决你的问题.
    http://szitr.com/bbs/thread-320-1-1.html
      

  3.   


    是啊,就是僵住了,本来里面还放了个Timer,用来显示时间的,没想到连Timer都僵住了我是新手,很多还部冻,能不能给个简单的实例?
      

  4.   

    肯定不能随时显示啊!你想想计算机的运算速度有多快啊.
    一秒就好几亿次~Label控件怎么可能跟得上呢.肉眼也看不清啊.
    建议用一个进度条.把最大值设为i的最后计算值.这样i++就可以在进度条上显示了
      

  5.   

    谢谢,我假设label的显示内容不会变化太快,比如
    for (i=0;i <=100;i++) 

        XXXXXXXXXXXXXXXXXX; 
        ...... 
    } 只有100次循环,每次循环可能需要半分钟,如果label能显示的话,不会一闪而过吧!
    因我是个新手,还希望各位老师在建议启动线程进度的时候,能给个简单实例啊,谢谢
      

  6.   

    诶来个例子,比如要产生一百个随机数,并在产生过程中实时显示完成的百分比,产生的时间和产生的数字。
    1、从工具箱里拖一个backgroundworker控件进来。修改它的属性WorkerReportProgress为true。
    2、放一个button,一个listbox。
    3、添加相应的代码如下:
     //用以记录产生的时间和数字
            class ProcessInfo
            {
                public int number;
                public DateTime time;            public ProcessInfo(int number, DateTime time)
                {
                    this.number = number;
                    this.time = time;
                }
            }        private void button1_Click_1(object sender, EventArgs e)
            {
                backgroundWorker1.RunWorkerAsync();
            }        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                //产生100个随机数并在产生过程中报告完成百分比,产生的数字和产生的时间
                for (int i = 0; i < 100; i++)
                    backgroundWorker1.ReportProgress(i, new ProcessInfo(new Random().Next(), DateTime.Now));
            }        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                //接收状态变化信息并提示
                ProcessInfo info = e.UserState as ProcessInfo;
                listBox1.Items.Add("状态改变。时间:" + info.time.ToString() + "数字:" + info.number.ToString() + ";已完成百分之" + e.ProgressPercentage);
            }        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                //报告工作完成
                listBox1.Items.Add("完成");
            }
      

  7.   

    //.net framework 2003
    void f()
    {
        for (i=0;i <=10000000;i++) 
        { 
          label1.Text=i.ToString(); 
          XXXXXXXXXXXXXXXXXX; 
          ...... 
        } 
    }void Calc()
    {
      Thread t = new Thread(new ThreadStart(this.f));
      t.Start();
    }
      

  8.   

    非常感谢semify 和liqngjun123 semify老师的例子,例子很完整,让我初步了解了线程的机制,接下去可以更好的学习线程相关,以前一直看不懂线程,还是实例很重要啊。
    liqngjun123 的例子也很好,使用比较简单,不过会有调用控件的错误,我查了网上,也有解决的方法。不过这种方法好像还需要一个关闭线程的动作是不是?因为我关闭窗口,运行仍然在进行,一定要停止调试才会结束,呵呵