进度条开始和停止按钮单击使用线程

时间:2013-08-03 05:32:49

标签: c# progress-bar

我已经创建了一个C#windows应用程序,因为我插入了进度条。

单击按钮时,应显示进度条,然后它应该启动该过程大约2到3秒,当过程栏完成时,它应该被隐藏。

我已经使用此代码来解决此问题,但它无效。

当进度条运行时,标签框应该像“生成... 45%”并且在完成标签框后应该是“生成100%..”,但是当我插入标签时它会显示一些错误。

点击生成按钮之前的图片是这样的。

enter image description here
在处理我应该得到这样..
enter image description here
在最终流程ID应该是这样的,进度条应该隐藏..
enter image description here

        ProgressBar1.Visible = true;

        if (isProcessRunning)
        {
            MessageBox.Show("A process is already running.");
            return;
        }

        Thread backgroundThread = new Thread(
            new ThreadStart(() =>
            {
                isProcessRunning = true;
                for (int n = 0; n < 100; n++)
                {
                    Thread.Sleep(1);
                    progressBar1.BeginInvoke(new Action(() => progressBar1.Value = n));
                }
                MessageBox.Show("Generated!!!");


                if (progressBar1.InvokeRequired)
                    progressBar1.BeginInvoke(new Action(() => progressBar1.Value = 0));
                isProcessRunning = false;
            }

        ));

        // Start the background process thread
        backgroundThread.Start();

2 个答案:

答案 0 :(得分:11)

我建议您使用BackgroundWorker来显示C#winform中的进度条 这是一个例子,

    public partial class Form1 : Form
{
    BackgroundWorker bgw = new BackgroundWorker();       
    public Form1()
    {
        InitializeComponent();
        label1.Text = "";
        label2.Text = "";
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
        bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
        bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
        bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
        bgw.WorkerReportsProgress = true;
        bgw.RunWorkerAsync();
    }

    void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        int total = 57; //some number (this is your variable to change)!!

        for (int i = 0; i <= total; i++) //some number (total)
        {
            System.Threading.Thread.Sleep(100);
            int percents = (i * 100) / total;
            bgw.ReportProgress(percents, i);
            //2 arguments:
            //1. procenteges (from 0 t0 100) - i do a calcumation 
            //2. some current value!
        }
    }

    void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
        label1.Text = String.Format("Progress: {0} %", e.ProgressPercentage);
        label2.Text = String.Format("Total items transfered: {0}", e.UserState);
    }

    void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
         //do the code when bgv completes its work
    }
}

您可以在bgw_RunWorkerCompleted中将进度条设置为false 以下链接将说明如何使用backgroundworker
DotNetPerls
MSDN Reference
CodeProject
祝你好运:)

答案 1 :(得分:0)

这是我正在使用backgroundWorker的代码..

    public partial class Form1 : Form
{

    BackgroundWorker bgw = new BackgroundWorker();      
    public Form1()
    {
        InitializeComponent();
        label3.Text = "";


        this.StartPosition = FormStartPosition.CenterScreen;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }


    private void btn_generate_Click(object sender, EventArgs e)
    {
        progressBar1.Visible = true;
        bgw.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        bgw.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
        bgw.WorkerReportsProgress = true;
        bgw.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
       int total = 100; //some number (this is your variable to change)!!

        for (int i = 0; i <= total; i++) //some number (total)
        {
            System.Threading.Thread.Sleep(10);
            int percents = (i * 100) / 100;
            bgw.ReportProgress(percents, i);

        }
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
        label3.Text = String.Format("Progress: {0} %", e.ProgressPercentage);
        if (e.ProgressPercentage == 100)
        {
            label3.Text = String.Format("Generated.. {0} %", e.ProgressPercentage);

        }
       // label2.Text = String.Format("Total items transfered: {0}", e.UserState);
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        progressBar1.Visible = false;
    }



}`

在这个下面的代码中有一个问题,当我第一次单击按钮时,进度条运行一次,如果我第二次单击它运行2次等等...其他方面代码完全正常工作..