实现winfrom进度条及进度信息提示,winfrom程序假死处理(代码片段)

zhaoshujie zhaoshujie     2022-12-29     520

关键词:

方法一:使用线程

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

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

技术分享图片
控件名称分别为:
progressBar1;label1;textBox1;button1;

第二步:定义一个代理,用于更新ProgressBar的值(Value)及在执行方法的时候,返回方法的处理信息。
private delegate void SetPos(int ipos,string vinfo);//代理

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

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);
    

第四步:函数实现

private void button1_Click(object sender, EventArgs e)

    Thread fThread = new Thread(new ThreadStart(SleepT));
    fThread.Start();

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

private void SleepT()

    for (int i = 0; i < 500; i++)
    
        System.Threading.Thread.Sleep(10);
        SetTextMesssage(100*i/500,i.ToString()+"
");
    

程序运行效果图:

技术分享图片
 

方法二:控件BackgroundWorker

     功能描述:该种方法通过控件backgroundWorker1实现,进度条。进度条在一个模板窗体内。
 
第一步:主窗体设计:
  控件名称:button1;backgroundWorker1;对backgroundWorker1控件,属性设置。

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

using System.Threading;//引用空间名称

private void button1_Click(object sender, EventArgs e)

    this.backgroundWorker1.RunWorkerAsync(); // 运行 backgroundWorker 组件
    ProcessForm form = new ProcessForm(this.backgroundWorker1);// 显示进度条窗体
    form.ShowDialog(this);
    form.Close();


private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

    if (e.Error != null)
    
        MessageBox.Show(e.Error.Message);
    
    else if (e.Cancelled)
        
        
        else
        
        

//你可以在这个方法内,实现你的调用,方法等。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

    BackgroundWorker worker = sender as BackgroundWorker;
    for (int i = 0; i < 100; i++)
    
        Thread.Sleep(100);
        worker.ReportProgress(i);
        if (worker.CancellationPending)  // 如果用户取消则跳出处理数据代码 
        
            e.Cancel = true;
            break;
        
    

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

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

技术分享图片
控件名称:
progressBar1;button1
 
第四步:子窗体,后台代码:
private BackgroundWorker backgroundWorker1; //ProcessForm 窗体事件(进度条窗体)

public ProcessForm(BackgroundWorker backgroundWorker1)

    InitializeComponent();
    this.backgroundWorker1 = backgroundWorker1;
    this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);


void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

    //this.Close();//执行完之后,直接关闭页面


void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)

    this.progressBar1.Value = e.ProgressPercentage;


private void button1_Click(object sender, EventArgs e)

    this.backgroundWorker1.CancelAsync();
    this.button1.Enabled = false;
    this.Close();

只为button选好事件,执行效果为:

技术分享图片

方法三:方法二增强

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


 第一步:主窗体设计:

  控件名称:button1;backgroundWorker1;对backgroundWorker1控件,属性设置。

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

private void button1_Click(object sender, EventArgs e)

    this.backgroundWorker1.RunWorkerAsync(); // 运行 backgroundWorker 组件
    ProcessForm form = new ProcessForm(this.backgroundWorker1);// 显示进度条窗体
    form.ShowDialog(this);
    form.Close();


private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

    if (e.Error != null)
    
        MessageBox.Show(e.Error.Message);
    
    else if (e.Cancelled)
    
    
    else
    
    

//你可以在这个方法内,实现你的调用,方法等。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)

    BackgroundWorker worker = sender as BackgroundWorker;
    for (int i = 0; i < 100; i++)
    
        Thread.Sleep(100);
        worker.ReportProgress(i, i.ToString() + "  你好!
"); //注意:这里向子窗体返回信息值,这里是两个值,一个用于进度条,一个用于文本框的。
        if (worker.CancellationPending)  // 如果用户取消则跳出处理数据代码 
        
            e.Cancel = true;
            break;
        
    

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

技术分享图片

 控件:progressBar1;textBox1;button1

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

private BackgroundWorker backgroundWorker1; //ProcessForm 窗体事件(进度条窗体)

public ProcessForm(BackgroundWorker backgroundWorker1)

    InitializeComponent();
    this.backgroundWorker1 = backgroundWorker1;
    this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);


void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

    //this.Close();//执行完之后,直接关闭页面


void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)

    this.progressBar1.Value = e.ProgressPercentage;
    this.textBox1.AppendText(e.UserState.ToString());//主窗体传过来的值,通过e.UserState.ToString()来接受


private void button1_Click(object sender, EventArgs e)

    this.backgroundWorker1.CancelAsync();
    this.button1.Enabled = false;
    this.Close();

实现的效果:

技术分享图片
注意:如果在程序为执行完,就点击取消的话,很有可能会报错的,这时候,你就修改一个方法:backgroundWorker1_ProgressChanged如下:
void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)

    this.progressBar1.Value = e.ProgressPercentage;
    this.textBox1.Text += e.UserState.ToString(); //主窗体传过来的值,通过e.UserState.ToString()来接受

       把这个方法,替换上边的那个方法,就可以了。


方法四:线程与代理

功能描述:本方法实现进度条显示,方法执行信息反馈显示。用到的技术点为 线程与代理。
     
步骤一:添加主页面。        
  控件名称:button1;
步骤二:主页面后台代码
using System.Threading;//引用此命名

//创建代理。
private Form6 myProcessBar = null;//弹出的子窗体(用于显示进度条)
private delegate bool IncreaseHandle(int nValue,string vinfo);//代理创建
private IncreaseHandle myIncrease = null;//声明代理,用于后面的实例化代理
private int vMax = 100;//用于实例化进度条,可以根据自己的需要,自己改变

private void button1_Click(object sender, EventArgs e)

    Thread thdSub = new Thread(new ThreadStart(ThreadFun));
    thdSub.Start();

private void ThreadFun()

    MethodInvoker mi = new MethodInvoker(ShowProcessBar);
    this.BeginInvoke(mi);
    Thread.Sleep(100);
    object objReturn = null;
    for (int i = 0; i < vMax; i++)
    
        objReturn = this.Invoke(this.myIncrease, new object[]  2, i.ToString() + "
" );
        Thread.Sleep(50);
    

private void ShowProcessBar()

    myProcessBar = new Form6(vMax);
    myIncrease = new IncreaseHandle(myProcessBar.Increase);
    myProcessBar.ShowDialog();
    myProcessBar = null;

步骤三:创建子窗体

  控件名称:progressBar1;textBox1
步骤四:子窗体,后台代码
public Form6(int vMax)

    InitializeComponent();
    this.progressBar1.Maximum = vMax;

public bool Increase(int nValue,string nInfo)

    if (nValue > 0)
    
        if (progressBar1.Value + nValue < progressBar1.Maximum)
        
            progressBar1.Value += nValue;
            this.textBox1.AppendText(nInfo);
            Application.DoEvents();
            progressBar1.Update();
            progressBar1.Refresh();
            this.textBox1.Update();
            this.textBox1.Refresh();
            return true;
        
        else
        
            progressBar1.Value = progressBar1.Maximum;
            this.textBox1.AppendText(nInfo);
            //this.Close();//执行完之后,自动关闭子窗体
            return false;
        
    
    return false;

 



android移动应用开发之使用异步调用进度条及实现幻灯片切换效果(代码片段)

文章目录异步调用进度条实现幻灯片切换效果异步调用进度条核心代码如下:packagescq.scq.asyntaskdemo;importandroidx.appcompat.app.AppCompatActivity;importandroid.app.Dialog;importandroid.app.ProgressDialog;importandroid.os.AsyncTask 查看详情

[winfrom]下载文件并显示进度条的实现代码(代码片段)

功能实现填写下载地址URL,点击另存为按钮,打开另存为对话框,可以选择保存路径,点击下载按钮进行下载,下载过程显示下载百分比和进度条。窗体:组件labelTextBoxButtonprogressBarsaveFileDialog获取saveFileDialog1文件名和路径Path.Get... 查看详情

正点原子i.mx6u修改开机进度条及内核logo(代码片段)

参考:【正点原子】I.MX6U修改开机进度条及内核logo参考手册V1.0.pdf1、修改进度条其及其logo1下载psplash源码可以在网上下载psplash源码,正点原子也提供了修改好的psplash源码在光盘中。光盘路径:开发板光盘A-基础资料\... 查看详情

正点原子i.mx6u-mini修改开机进度条及内核logo(代码片段)

参考:【正点原子】I.MX6U修改开机进度条及内核logo参考手册V1.0.pdf1、修改进度条其及其logo1下载psplash源码可以在网上下载psplash源码,正点原子也提供了修改好的psplash源码在光盘中。光盘路径:开发板光盘A-基础资料\... 查看详情

c#怎么实现页面提示加载中进度

...进度的话,进度条就是一直在动。 参考技术Bjs同样可以实现,页面js提交后,在返回数据没有返回时,隐藏div"加载中。。。"设置为block 参考技术C有一个控件叫ProgressBar看下他的使用方法就行了 查看详情

android自定义progressbar,实现漂亮的进度提示框(代码片段)

在android智能平板设备应用中,一项耗时的操作总要有个提示进度的框来提高用户的操作体验,操作进度提示框就显得很常用了。系统自带的有进度条ProgressBar,一般用于显示一个过程,例如数据加载过程,文件下载... 查看详情

《结队-航空购票系统-项目进度》

...项目的进度:1 打开应用程序的界面2 简单的登录实现用户登录后的跳转3  档用户输入错误的账号密码时的提示信息4 可以选择但是没有实现提交已经选择的内容5  数据的采集 目前程序处于半开发阶... 查看详情

kyuubi输出任务进度信息改造(代码片段)

文章目录一、HiveQueryLog的实现客户端方面服务端实现日志的读取日志的写入二、Kyuubi增加进度日志输出附录一、HiveQueryLog的实现由于Kyuubi、SparkThriftServer的实现框架都是用的HiveServer。因此这里只介绍HiveServer是如何实现QueryLog的。... 查看详情

纯css实现进度条效果

...度条;    斜纹进度条用线性渐变 linear-gradient类实现,原理很好理解,2个参数:      1、角度;      2、关键点(包含2个参数,1是颜色,2是长度位置)    displ 查看详情

《结队-航空购票系统-项目进度》

...项目的进度:1 打开应用程序的界面2 简单的登录实现用户登录后的跳转3 当用户输入错误的账号密码时的提示信息4 可以选择但是没有实现提交已经选择的内容5  数据的采集6 大部分ui界面已经完成,就... 查看详情

winform进度条实现(代码片段)

...常见的比如“转圈圈”,“省略号”等等。使用c#做WinFrom开发,要实现进度条效果就需要用到多线程,如果不采用多线程控制进度条,窗口很容易假死。1、设计界面,注意需要引用 using System.Threading;控件名... 查看详情

闲话进度条

...式,包括传统的横向进度条以及各种loading图;也有不同的实现方法,各种黑科技黑魔法。本文探讨两个问题,第一个为什么要有进度条;第二个,进度条实现的一点点知识。重点在前者。  为什么要有进度条,前些天在知乎日报... 查看详情

团队-排课系统-项目进度

...s:对于班级区域将控件已经修改成了ListBox课程ListBox已经实现与Label的联动,点击课程会显示相应的课程详细信息,数据信息均来自于数据库。同时课程信息与班级信息已经实现联动,当选择一门课程时,系统会自动识别所选的... 查看详情

怎样在金蝶k3k实现采购进度控制,也就是不断往里面录入采购订单信息。可以查看到进度

需要能查询到订单有没有发出,供应商有没有回签,有没有发货,开票没有,等等参考技术A金蝶K312.0以上版本有【采购订单全程跟踪表】,可以满足你的需求。 本回答被提问者和网友采纳 参考技术B里面有一个采购订单执行... 查看详情

1600802039(代码片段)

 实现功能:1.实现音乐的播放,暂停,上一首,下一首2.生成播放列表3.提示音乐信息4.显示播放进度条,且进度条可拖拽实现截图:关键代码分析publicArrayList<MusicMedia>scanAllAudioFiles()ArrayList<MusicMedia>mylist=newArrayList<M... 查看详情

android进度条样式怎么改

Android系统提供了两大类进度条样式,长形进度条(progressBarStyleHorizontal)和圆形进度条(progressBarStyleLarge)。android进度条样式更改:第一种(默认样式(中等圆形))第二种(长方形进度条)进度条用处很多,比如,应用程序装载资源... 查看详情

winform实现多线程异步更新ui(进度及状态信息)

...ystem.Threading.Thread的一个实例的Start方法就行了,但是如何实现多线程之间的交互就不是那么简单 查看详情

关于文件上传下载以及其他进度条的实现

现在我的上传,下载,或者某个批量的进度的进度条实现思路都是这样:  定义一自定义类,列出总数量,完成数(有需求决定可分成功与失败)  然后访问链接的时候进行处理,将session中存入自定义类,自定义类中存入... 查看详情