C# 防止界面假死 多线程进度条的合理使用
好长时间没发博了 。。
这两天用C#写了一个批量分割图片前景的软件,最初的时候没用多线程,执行批量分割就假死,后来就换成了多线程,结果还是假死。。
网上找了几篇博文看了看,才发现错误的地方。
好了,首先看不合理的情况。
//点击按钮开始工作
private void btnStartWorking_Click(object sender, EventArgs e)
{Thread multi = new Thread(new ThreadStart(StartWork));multi.IsBackground = true;multi.Start();
}//定义一个委托
private delegate void DelegateFunction();//执行函数void StartWork()
{if (this.progressBar.InvokeRequired){DelegateFunction df = new DelegateFunction(StartMultiWork);this.Invoke(df);}else{ progressBar.Maximum = 10000;for (int i = 1; i <= 10000;i++ ){//...........//在这里执行一个非常非常耗时的函数 DoLongTimeWork()DoLongTimeWork();//...........progressBar.Value = i;Application.DoEvents(); //让主窗体去执行消息列队的其他指令}}}
上面的代码中虽然有Application.DoEvents()函数,但是软件在两个Application.DoEvents()之间,程序主界面会死一阵子。说道这里,貌似很明了了。
下面这样就行了
//点击按钮开始工作
private void btnStartWorking_Click(object sender, EventArgs e)
{Thread multi = new Thread(new ThreadStart(StartWork));multi.IsBackground = true;multi.Start();
}//定义一个委托
private delegate void DelegateFunction(int ipos);//执行函数void StartWork()
{ //设置进度条最大值 this.progressBar.Maxmum = 10000;for (int i = 1; i <= 10000;i++ ){//...........//在这里执行一个非常非常耗时的函数 DoLongTimeWork()DoLongTimeWork();//...........SetPos(i); //关键就在这里,只有将要更改progressBar的value的时候 才去Invoke 这样就不会一直占用着主界面的刷新 }
}
//设置进度条的Value
private void SetPos(int ipos)
{if (this.progressBar.InvokeRequired){DelegateFunction df = new DelegateFunction(StartMultiWork);this.Invoke(df,new object[]{ipos});}else{ProgressBar.Value = Int32.Parse(ipos);}}
C# 防止界面假死 多线程进度条的合理使用相关推荐
- qt开启线程界面假死问题解决
一.前言 在 使用qt高速读取传感器数据时,如果想要将数据实时刷新在界面,就需要开启一个线程单独去跑读取数据函数,并反馈给主程序,否则在主程序中读取和刷新界面会很卡很卡,但是在开启多线程,无外接鼠标键 ...
- 解决Qt 5程序运行时界面假死的方法
在Qt 5的GUI程序中,主线程也叫GUI线程,因为它是唯一被允许执行GUI相关操作的线程.对于一些计算量比较大的非常耗时的操作,如果放在主线程中,就是出现界面无法响应的问题.这种问题的解决一种方式是 ...
- WinForm程序界面假死,寻求完美解决方案
WinForm程序界面假死,寻求完美解决方案 参考文章: (1)WinForm程序界面假死,寻求完美解决方案 (2)https://www.cnblogs.com/funying/p/3230873. ...
- 进度条线程怎么用java,多线程 进度条 java
场景:java设计形式(2)-观察者模式Swing 多线程事件处理进度条和Observer的一个具体应用 java设计模式(2)--观察者模式Swing 多线程事件处理进度条和Observer的一个具 ...
- Android小项目之--前台界面与用户交互的对接 进度条与拖动条(附源码)
都知道水果公司(苹果)是己尊重用户体验著称的公司,其设计的产品人性化十足,不得不令后来者赞叹,竞相模仿.iphone的成功就是其典型的案例,做为其移动系统的死对头 Google 想要在市场上分得一杯羹 ...
- C# Application.DoEvents() 处理队列消息,防界面假死。
该方法可以处理当前队列的消息,比如一个for循环 5000次 向TextBox中追加文本,那肯定会假死一会儿的. 此时便可使用Application.DoEvents()来处理队列的信息. 简单说下使 ...
- 多线程 进度条 C# .net
前言 在我们应用程序开发过程中,经常会遇到一些问题,需要使用多线程技术来加以解决.本文就是通过几个示例程序给大家讲解一下多线程相关的一些主要问题. 执行长任务操作 许多种类的应用程序都需要长时间操作, ...
- C#多线程与UI响应 防止界面假死不响应(子线程创建的窗体获取消息响应用Application.DoEvent )
一. 概述 在使用C#进行应用程序设计时,经常会采用多线程的方式进行一些后台任务的工作.对于不同的应用场景,使用的策略也不尽相同. 1. 后台循环任务,少量UI更新:例如批量上传文件,并提供进度.这种 ...
- WinForm多线程+委托防止界面假死
当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决 using System; using System.Collections.Generic ...
最新文章
- 算法之最近最少使用LRU
- 大数据在彩票预测和解决社会问题的用处
- SQLServer性能优化之查询提示
- python用变量输出abcd_python中星号变量的几种特殊用法
- 工业用微型计算机(27)-dos和BIOS调用(1)
- mysql myisam/innodb高并发优化经验_MySQL MyISAM / PHP 高并发优化经验
- APIC ID 的通用七级解释与概念性六级拓扑:APICID
- 内容页嵌套母版页时,内容页如何调用css和javascript
- 强悍的vim —— 变量的访问
- 《大道至简》 第一章 读后感
- python同时赋值_Python 中变量赋值传递时的引用和拷贝
- Ubuntu20.04如何解决QQ闪退问题(亲测有效)
- c++ 字符串替换指定字符
- 匈牙利算法寻找最大匹配
- PhotoShop 之钢笔工具
- Capstone 专注HDMI转VGA DP转VGA DP转HDMI DP转LVDS TYPEC转HDMI拓展方案+设计PCB板图
- 裁判文书App(2020最新版) 逆向过程分析
- 在腾讯云搭建代理服务器的全部过程
- 新安装的福昕阅读器总是弹出“文件安全进程防护”
- Scaling Vision Transformers
热门文章
- 微型计算机在cad和cam中,重庆大学网络教育学院2013年9月份考试机械CAD/CAM第一次作业及答...
- AD19(Altium Designer)改变敷铜颜色
- php tpl smarty,如何在smarty .tpl文件中调用php函数?
- 基于STM32的0.96寸OLED屏显示学号姓名和滚动显示
- 2022年金融行业证书汇总,金融类证书哪个适合报考
- Win11遇到问题需要重启怎么办?
- CKEditor5系列一:安装及使用
- iOS 最完整小说阅读器(Swift-Demo)
- 二叉树应用-Huffman编码树(数据结构基础 第6周)
- 生信工具 | TCGA数据分析工具GEPIA最新更新,用于免疫细胞浸润分析