且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理

更新时间:2022-09-16 18:20:37

china_xuhua 原文地址

 

1、方法一:使用线程

 功能描述:在用c#做WinFrom开发的过程中。我们经常需要用到进度条(ProgressBar)用于显示进度信息。这时候我们可能就需要用到多线 程,如果不采用多线程控制进度条,窗口很容易假死(无法适时看到进度信息)。下面我就简单结合一个我写的例子给大家做一个介绍。

第一步:设计界面,注意需要引用 using System.Threading;

[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理
控件名称分别为:
   progressBar1;label1;textBox1;button1;

第二步:定义一个代理,用于更新ProgressBar的值(Value)及在执行方法的时候,返回方法的处理信息。

        private delegate void SetPos(int ipos,string vinfo);//代理

第三步:进度条值更新函数(参数必须跟声明的代理参数一样)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void SetTextMesssage(int ipos,string vinfo)
       {
           if (this.InvokeRequired)
           {
               SetPos setpos = new SetPos(SetTextMesssage);
               this.Invoke(setpos, new object[] { ipos,vinfo });
           }
           else
           {
               this.label1.Text = ipos.ToString() + "/1000";
               this.progressBar1.Value = Convert.ToInt32(ipos);
               this.textBox1.AppendText(vinfo);
           }
       }

第四步:函数实现

1
2
3
4
5
private void button1_Click(object sender, EventArgs e)
        {
            Thread fThread = new Thread(new ThreadStart(SleepT));
            fThread.Start();
        }

第五步:新的线程执行函数:

1
2
3
4
5
6
7
8
private void SleepT()
        {
            for (int i = 0; i < 500; i++)
            {
                System.Threading.Thread.Sleep(10);
                SetTextMesssage(100*i/500,i.ToString()+"\r\n");
            }
        }

 

程序运行效果图:

[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理
 
=========================================================================================
 

2、第二种方法

功能描述:该种方法通过控件backgroundWorker1实现,进度条。却进度条在一个模板窗体内。
 
第一步:主窗体设计:
[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理 

 控件名称:

button1;backgroundWorker1;

对backgroundWorker1控件,属性设置:

[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理
 

 第二步:主页面后台代码:

 

分别为button控件和backgroundWorker1控件选好事件。

第三步:设置子窗体(及显示进度条的窗体):

[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理
控件名称:
progressBar1;button1
 
第四步:子窗体,后台代码:

        

 

只为button选好事件

执行效果为:

[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理
 

3、第三种方法:

     功能描述:在处理大量数据的时候,有时候方法的执行需要一定的时间,这时候往往会造成页面或程序的“假死”状态,给用户的体验度也不是很好。为了避免出现 “假死”提高用户的体验度,在这里为这类型的方法加了一个进度条和一个文本框,进度条用于显示程序处理的进度,文本框用于显示在处理过程中,给与的提示。 本方法主要使用了控件:backgroundWorker1;说明:本方法与上面的方法(方法二)基本类型,主要是设计和代码进行了一些修改。


 第一步:主窗体设计:
[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理 

控件名称:

button1;backgroundWorker1;

对backgroundWorker1控件,属性设置:


[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理

第二步:主窗体 后台代码:

       

 

第三步:设置子窗体(及显示进度条的窗体):

[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理

 控件:

progressBar1;textBox1;button1

第四步:子窗体后台代码:

      

实现的效果:

[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理
注意:如果在程序为执行完,就点击取消的话,很有可能会报错的,这时候,你就修改一个方法:backgroundWorker1_ProgressChanged
如下:
        void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;
            this.textBox1.Text += e.UserState.ToString(); //主窗体传过来的值,通过e.UserState.ToString()来接受
        }
       把这个方法,替换上边的那个方法,就可以了。
 

4、第四种方法:

 
     功能描述:本方法实现进度条显示,方法执行信息反馈显示。用到的技术点为 线程与代理。
     
    步骤一:添加主页面。
      
[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理
 
控件名称:
button1;
 
  步骤二:主页面后台代码
       

 

 

步骤三:创建子窗体
[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理
 控件名称:
progressBar1;textBox1
 
步骤四:子窗体,后台代码
      
 
执行效果:
[转] 实现winfrom进度条及进度信息提示,winfrom程序假死处理
 
 
 
没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的***、好奇、充满创造力的想法被现实的框架所束缚,让创造力***成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。



    本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5734724.html,如需转载请自行联系原作者