小弟初学C#,身边也没老师教。。
最近Boss要求用进度条做个记时程序,
但是搜了很多代码看,也没看出什么门道来
希望大家帮忙解决一下吧我都想了三天了程序功能:每隔一秒,进度条走一格,每分钟更改一次时间

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace jdt
{
    public partial class Form1 : Form{
        private delegate void ThreadInvoke();
        private Thread ttt = null;
        public Form1(){
            InitializeComponent();
        }        private void button1_Click(object sender, EventArgs e){
            this.ttt = new Thread(new ThreadStart(this.setProgress));
            this.ttt.Name = "progress";
            this.ttt.Start();
            this.button1.Enabled = false;
        }        private void StartProgress(){
            int i = 1,nowtime=0;
            while (true){
                this.progressBar1.Value = i;
                this.label1.Text = "已经过去了" + nowtime + "分";
                i++;
                if (i > 60){
                    i = 1;
                }
                Thread.Sleep(1000);
            }
        }        private void setProgress(){
            this.Invoke(new ThreadInvoke(this.StartProgress));
        }
    }
}

解决方案 »

  1.   

    StartProgress()
    中的变量
                int i = 1,nowtime=0;
    改为全局的.
      

  2.   

    progressBar1.PerformStep();
    后面加上Application.DoEvents();
      

  3.   

    re:friendmastor用了你的方法,窗口可以动了,不过每动一下窗口就要卡一下,
    还有,运行此程序的时候,如果是直接关闭窗口,线程不会自己终止。
    请问还有新的解决办法么?
      

  4.   

    lz的写法有问题,
    StartProgress实际是在UI线程上跑的
      

  5.   

    re:vwxyzh
    我不会嘛初学者
    还是米有老师教的。
    书上的和网络上搜索的C#线程资料要么就没用。。要么就看不懂
      

  6.   

    Control.Invoke方法的实际作用是把委托Send到UI线程执行
    lz这里的setProgress方法里面,用StartProgress方法创建一个委托,然后把这个委托Send到UI线程
    所以,StartProgress方法里面的Thread.Sleep(1000)直接作用于UI线程,导致UI失去响应
      

  7.   

    re:vwxyzh 
    那请问我应该怎么做?
    另外写一个类专门处理线程吗?
    可是我另外写的类要怎么控制UI中的进度条和标签?
    C#的机制是不允许非界面线程处理界面元素啊。。
      

  8.   

    C#的机制是不允许非界面线程处理界面元素啊。。
    ----------
    使用delegate 委托就是了
      

  9.   

    lz想一下,StartProgress里面那些是要在UI线程里面才能做的,那些必须在非UI线程里面做的,和上面说的Control.Invoke方法的实际作用,答案自然就出来了
    Hint:
    //操作UI的应该是哪个线程跑
    this.progressBar1.Value = i;
    this.label1.Text = "已经过去了" + nowtime + "分";
    //
    //应该Sleep的是哪个线程
    Thread.Sleep(1000);
      

  10.   


           private void button1_Click(object sender, EventArgs e){
                this.ttt = new Thread(new ThreadStart(StartProgress));
                this.ttt.Name = "progress";
                this.ttt.Start();
                this.button1.Enabled = false;
            }        private void StartProgress(){
                int i = 1,nowtime=0;
                while (true){
                    UpdateBar(i); 
                    this.label1.Text = "已经过去了" + nowtime + "分"; //此处类似的使用delegate就是哦,代码自己照着写
                    i++;
                    if (i > 60){
                        i = 1;
                    }
                    Thread.Sleep(1000);
                }
            }
            delegate void dUpdateBar(int i);
            private void UpdateBar(int i)
            {
                 if(this.progressBar1.invokeRequired)
                   {
                      dUpdateBar d=new dUpdateBar();
                      this.progressBar1.Invoke(UpdateBar,new object[]{i});
                   }
                  else
                    this.progressBar1.value=i;     
            }
      

  11.   

    private void button1_Click(object sender, EventArgs e){
                this.ttt = new Thread(new ThreadStart(StartProgress));
                this.ttt.Name = "progress";
                this.ttt.Start();
                this.button1.Enabled = false;
            }        private void StartProgress(){
                int i = 1,nowtime=0;
                while (true){
                    UpdateBar(i); 
                    this.label1.Text = "已经过去了" + nowtime + "分"; //此处类似的使用delegate就是哦,代码自己照着写
                    i++;
                    if (i > 60){
                        i = 1;
                    }
                    Thread.Sleep(1000);
                }
            }
            delegate void dUpdateBar(int i);
            private void UpdateBar(int i)
            {
                 if(this.progressBar1.invokeRequired)
                   {
                      dUpdateBar d=new dUpdateBar();
                      this.progressBar1.Invoke(UpdateBar,new object[]{i});
                   }
                  else
                    this.progressBar1.value=i;     
            }
      

  12.   

    re:vwxyzh
    谢谢你的提醒,现在问题已经解决。。
    还有一个新问题:
    我关闭窗口后会抛出一个异常:“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。”
    这是什么东东?如何解决?
      

  13.   

    RE:xray2005你的方法我一会也试试。不过好像比vwxyzh复杂一点啊
    有点看不懂。正在查帮助。。嘿嘿