开发者社区> 橘子红了呐> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介:
+关注继续查看

china_xuhua 原文地址

 

1、方法一:使用线程

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

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

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华
控件名称分别为:
   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程序假死处理 - china_xuhua - 许华
 
=========================================================================================
 

2、第二种方法

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

 控件名称:

button1;backgroundWorker1;

对backgroundWorker1控件,属性设置:

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华
 

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

 

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

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

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

        

 

只为button选好事件

执行效果为:

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华
 

3、第三种方法:

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


 第一步:主窗体设计:
实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华 

控件名称:

button1;backgroundWorker1;

对backgroundWorker1控件,属性设置:


实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

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

       

 

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

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华

 控件:

progressBar1;textBox1;button1

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

      

实现的效果:

实现winfrom进度条及进度信息提示,winfrom程序假死处理 - china_xuhua - 许华
注意:如果在程序为执行完,就点击取消的话,很有可能会报错的,这时候,你就修改一个方法: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程序假死处理 - china_xuhua - 许华
 
控件名称:
button1;
 
  步骤二:主页面后台代码
       

 

 

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



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



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
CV:利用cv2+dlib库自带frontal_face_detector(人脸征检测器)实现人脸检测与人脸标记之《极限男人帮》和《NBA全明星球员》
CV:利用cv2+dlib库自带frontal_face_detector(人脸征检测器)实现人脸检测与人脸标记之《极限男人帮》和《NBA全明星球员》
86 0
阿里云容器服务新建集群优化方案(更新版)-使用控制台创建与ingress绑定的SLB
本文为之前博文 阿里云容器服务新建集群优化方案:https://yq.aliyun.com/articles/696136 的补充,使用控制台可以更快速的创建于 ingress 绑定的VPC 类型 SLB
1207 0
好程序员web前端分享js剪切板Clipboard.js 使用
好程序员web前端分享js剪切板Clipboard.js 使用,clipboard.js是一个用来设置剪切板的库,小巧无依赖,但用法有点诡异,必须依赖一个DOM元素。 必须要与一个DOM元素相关联,并且需要用户的点击操作才能实现功能(这样看来,浏览器还是挺安全的) 普通使用推荐下面这种用法,这里的...
1597 0
WinCE应用程序崩溃提示框的处理
  WinCE的开发人员和WinCE设备的用户应该对下面这两个错误不陌生,"Application encountered a serious error and must shut down"和"出现严重错误,必须被关闭"。
1101 0
【Web API系列教程】3.7 — 实战:处理数据(创建UI视图)
在本节,你将开始为app定义HTML,并在HTML和视图模型间添加数据绑定。 打开Views/Home/Index.cshtml文件。
761 0
【Web API系列教程】3.5 — 实战:处理数据(创建数据传输对象)
现在,我们的Web API暴露数据库实体给客户端,而客户端接收直接映射到你的数据库表的数据。然而,这不永远都是个好办法。有时候你可以想要改变发送到客户端的数据的形式。
859 0
3402
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载