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 = 0; i <= 100; i++)
{
this.progressBar1.Value = i;
System.Threading.Thread.Sleep(300);
}
}

第四步:处理窗体假死问题
(用到多线程和委托)

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(100);
} //线程方法 一定要是obje 类型参数 同时返回值是void
private void Download(object obj)
{
for (int i = 0; i <= 100; i++)
{
//执行委托
changeProgerss(i);
System.Threading.Thread.Sleep(300);
}
} //在下载窗体上面 建一个委托
public delegate void ChangeProgress(int value);
//创建上面的委托的变量
public ChangeProgress changeProgerss; }

第五步:处理跨线程调用ui
线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。

      for (int i = 0; i <= 100; i++)
{
//执行委托
this.progressBar1.Invoke(changeProgerss, i);
//changeProgerss(i);
System.Threading.Thread.Sleep(300);
}

第六步 主窗体添加委托 解决跨线程调用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中 事件 委托 多线程的应用的更多相关文章

  1. WinForm中 事件 委托 多线程的应用【以一个下载进度条为例】

    第一步:首先我们创建一个winfor的项目 第二步:我们建一个窗体 在一个窗体里面 打开一个另外的窗体 另外的窗体有一个按钮 点击后就开始下载 下载完成后 在注册窗体上面 显示下载完成(达到在一个窗体 ...

  2. 在WinForm中使用委托来在其他线程中改变控件的显示

    假设winform中有两个控件: 1.ListView用来显示进度的文本提示,ID:listView_progressInfo 2.ProgressBar用来显示进度,ID:progressBar1 ...

  3. JavaScript中事件委托(事件代理)详解

    在JavaScript的事件中,存在事件委托(事件代理),那么什么是事件委托呢? 事件委托在生活中的例子: 有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托 ...

  4. 对JS中事件委托的理解

    什么是事件委托: 事件委托——给父元素绑定事件,用来监听子元素的冒泡事件,并找到是哪个子元素的事件.(不理解冒泡的可以去百度下) 定义:利用事件冒泡处理动态元素事件绑定的方法,专业术语叫事件委托. 使 ...

  5. winform中如何在多线程中更新UI控件--ListView实时显示执行信息

    1.在winform中,所有对UI的操作,都得回到UI线程(主线程)上来,才不会报错 线程间操作无效: 从不是创建控件的线程访问它. 2.在winform中,允许通过Control.invoke对控件 ...

  6. Winform中利用委托实现窗体之间的传值

    点击打开按扭,打开传输值窗体 public partial class Form1 : Form { public Form1() { InitializeComponent(); } public ...

  7. winform中使用委托进行窗体之间的传值

    一.传统的方式 创建一个公共数据资源类,用于存储窗体2的TextBox的值: public class ComValue { public static string Txtvalue { get; ...

  8. Js 中的事件委托/事件代理

    什么叫事件委托/事件代理呢 ? JavaScript高级程序设计上讲:事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件.   事件冒泡: 当事件发生后,这个事件就要开始传 ...

  9. 简单说 JavaScript中的事件委托(下)

    说明 上次我们说了一些,关于 JavaScript中事件委托的 基础知识,这次我们继续来看. 解释 先来一段代码 <!doctype html> <html lang="e ...

随机推荐

  1. centos7看电影

    sudo rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm sudo rpm ...

  2. SEO 优化,网站推广优化教程100条(SEO,网站关键字优化,怎么优化网站,如何优化网站关键字)

    这篇文章不错.  http://www.cnblogs.com/zangdalei/archive/2010/08/31/1814047.html 看了一半之后的,觉得不太靠谱,很多都不懂. 于是 找 ...

  3. 解决IIS7运行ASP提示错误:An error occurred on the server when processing the URL. Please contact the system administrator

    原文:解决IIS7运行ASP提示错误:An error occurred on the server when processing the URL. Please contact the syste ...

  4. Installshield在安装结束时刷新系统

    原文:Installshield在安装结束时刷新系统 在OnEnd里添加代码,两种解决方案 群友kevin的解决方案 #include "ifx.h"  //Call to Win ...

  5. oracle中的DECODE

    原文:oracle中的DECODE   DECODE函数相当于一条件语句(IF).它将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值.函数的参数列表是由若干数值及其对应结果值组成的若干序偶 ...

  6. HBuilder js 自定义代码块

    =begin 本文档是HBuilder预置的js代码块的文件.注意不要把其他语言的设置放到js里来. 如果用户修改此文档,HBuilder升级后会覆盖用户的修改,建议进入菜单 工具→扩展代码块 扩展相 ...

  7. shell删除指定时间之前的文件

    cat delbak.sh 1 #!/bin/sh 2 location="/root/sqlbak/" 3 find $location -mtime +30 -type f | ...

  8. 给Angularjs配上Requirejs

    给Angularjs配上Requirejs 需要考虑的事情: 1.js.css.template都按需加载,js主要就controller: * js和css都可以用requirejs和它的插件解决, ...

  9. 对student进行增删改

    drop package TechEd_pkg_Student; CREATE OR REPLACE PACKAGE TechEd_pkg_Student AS FUNCTION F_CREATE(p ...

  10. linux 编程技术

    linux 编程技术No.1前期准备工作 GCC的编译过程分为预处理.生成汇编代码.生成目标代码和链接成可执行文件等4个步骤. 使用vim编写C 文件 : [lining@localhost prog ...