WinForm中 事件 委托 多线程的应用【以一个下载进度条为例】
第一步:首先我们创建一个winfor的项目

第二步:我们建一个窗体
在一个窗体里面 打开一个另外的窗体 另外的窗体有一个按钮 点击后就开始下载 下载完成后 在注册窗体上面 显示下载完成(达到在一个窗体里面修改另外的一个窗体)

private void button1_Click(object sender, EventArgs e)
{
FormLoad fl = new FormLoad();
fl.Show();
}
第三步:完成下载窗体的进度条

private void button1_Click(object sender, EventArgs e)
{
for (int i = ; i <= ; i++)
{
this.progressBar1.Value = i;
System.Threading.Thread.Sleep();
}
}
第四步:处理窗体假死问题
(用到多线程和委托)
public partial class FormLoad : Form
{
public FormLoad()
{
InitializeComponent();
//为这个委托变量赋值
changeProgerss = FunChangeProgress;
} public void FunChangeProgress(int value)
{
this.progressBar1.Value = value;
} private void button1_Click(object sender, EventArgs e)
{
//创建一个线程
System.Threading.Thread thr = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Download));
thr.Start();
} //线程方法 一定要是obje 类型参数 同时返回值是void
private void Download(object obj)
{
for (int i = ; i <= ; i++)
{
//执行委托
changeProgerss(i);
System.Threading.Thread.Sleep();
}
} //在下载窗体上面 建一个委托
public delegate void ChangeProgress(int value);
//创建上面的委托的变量
public ChangeProgress changeProgerss; }
第五步:处理跨线程调用ui
线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。
for (int i = ; i <= ; i++)
{
//执行委托
this.progressBar1.Invoke(changeProgerss, i);
//changeProgerss(i);
System.Threading.Thread.Sleep();
}

第六步 主窗体添加委托 解决跨线程调用UI
public FormMain()
{
InitializeComponent();
sif = ShowInfoFun;
} public void ShowInfoFun(string text)
{
this.label1.Text = text;
}
private void button1_Click(object sender, EventArgs e)
{
FormLoad fl = new FormLoad();
//在主窗体中注册子窗体的事件
fl.eventShowInfo += new FormLoad.ShowInfo(fl_eventShowInfo);
fl.Show();
} //事件的执行方法
void fl_eventShowInfo(string text)
{
this.label1.Invoke(sif, text);
} //在主窗体这里 创建一个委托
public delegate void ShowInfo(string text);
public ShowInfo sif;
}
视频下载地址:http://pan.baidu.com/share/link?shareid=1740683788&uk=540184145
需要源码的可以到这里向楼主要:http://www.bamn.cn/redirect.php?tid=19&goto=lastpost#lastpost
WinForm中 事件 委托 多线程的应用【以一个下载进度条为例】的更多相关文章
- WinForm中 事件 委托 多线程的应用
WinForm中 事件 委托 多线程的应用[以一个下载进度条为例] 第一步:首先我们创建一个winfor的项目 第二步:我们建一个窗体在一个窗体里面 打开一个另外的窗体 另外的窗体有一个按钮 点击后就 ...
- WinForm中使用BackgroundWorker异步加载数据并使用进度条
在WinForm程序中,有时会因为加载大量数据导致UI界面假死,这种情况对于用户来说是非常不友好的.因此,在加载大量数据的情况下,首先应该将数据加载放在另一线程中进行,这样保证了UI界面的响应:其次可 ...
- Android中ProgressBar的使用-通过Handler与Message实现进度条显示
场景 进度条效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改为 ...
- 在WinForm中使用委托来在其他线程中改变控件的显示
假设winform中有两个控件: 1.ListView用来显示进度的文本提示,ID:listView_progressInfo 2.ProgressBar用来显示进度,ID:progressBar1 ...
- JavaScript中事件委托(事件代理)详解
在JavaScript的事件中,存在事件委托(事件代理),那么什么是事件委托呢? 事件委托在生活中的例子: 有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托 ...
- 对JS中事件委托的理解
什么是事件委托: 事件委托——给父元素绑定事件,用来监听子元素的冒泡事件,并找到是哪个子元素的事件.(不理解冒泡的可以去百度下) 定义:利用事件冒泡处理动态元素事件绑定的方法,专业术语叫事件委托. 使 ...
- winform中如何在多线程中更新UI控件--ListView实时显示执行信息
1.在winform中,所有对UI的操作,都得回到UI线程(主线程)上来,才不会报错 线程间操作无效: 从不是创建控件的线程访问它. 2.在winform中,允许通过Control.invoke对控件 ...
- PHP中使用Session配合Javascript实现文件上传进度条功能
Web应用中常需要提供文件上传的功能.典型的场景包括用户头像上传.相册图片上传等.当需要上传的文件比较大的时候,提供一个显示上传进度的进度条就很有必要了. 在PHP .4以前,实现这样的进度条并不容易 ...
- Winform中利用委托实现窗体之间的传值
点击打开按扭,打开传输值窗体 public partial class Form1 : Form { public Form1() { InitializeComponent(); } public ...
随机推荐
- Asp.Net 控件 GridView
这两天做的作业都得用到visual studio 越来越发现其功能真心强大 前几天Asp.Net做了个界面增删查改的作业(连接数据库),用到了个组件GridView,感觉很强大 在这里小结一下(这里主 ...
- python3 杀死进程
在windows10杀死进程:Shadowsocks.exe os.system('taskkill /f /im %s' % 'Shadowsocks.exe')
- 【Spark】Spark-性能调优-系列文章
Spark-性能调优-系列文章 Spark Master at spark://node-01:7077 scala java8_百度搜索 (1 封私信)如何评价Linkedin决定逐渐减少Scala ...
- getWidth() 和 getMeasuredWidth()的区别
getWidth(): View在设定好布局后整个View的宽度. getMeasuredWidth(): 对View上的内容进行测量后得到的View内容占据的宽度,前提是你必须在父布局的onLa ...
- Tensorflow LSTM实现
Tensorflow[LSTM] 0.背景 通过对<tensorflow machine learning cookbook>第9章第3节"implementing_lstm ...
- 学界 | Yann LeCun新作,中日韩文本分类到底要用哪种编码?
https://www.wxwenku.com/d/102093756 AI科技评论按:前几天,Yann LeCun与其学生 张翔在arXiv上发表了一篇新作「Which Encoding is th ...
- WPF装饰元素
Border: <Style TargetType="Border"> <Setter Property="CornerRadius" Val ...
- Axure-如何设置圆形组件
--打开Axure软件,在[选择部件库]窗口中找到如图中所示的矩形. --将矩形拖到设计布局中 --将鼠标悬停在矩形上就能看到右上角有一个小圆点 --点击小圆点就能选择不同的形状,如:圆形
- 能够在Linux系统中运行的5款大型耐玩游戏
Linux 可能不会很快成为游戏玩家选择的平台 —— Valve Steam Machines 的失败似乎是对这一点的深刻提醒 —— 但这并不意味着该平台没有稳定增长,并且拥有相当多的优秀游戏. 从独 ...
- Sqlite的多表连接更新
最近处理一个较大数据的sqlite库,基础表300万条,结果表30万条左右,我的笔记本跑起来还算流畅.最后结果,需要两个表连接,把另一个表的计算结果更新过来,却遇到麻烦.sqliter并不支持常见的连 ...