您的位置:首页 > 其它

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

2013-08-20 22:22 387 查看
第一步:首先我们创建一个winfor的项目



第二步:我们建一个窗体

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



?
 第三步:完成下载窗体的进度条



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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: