C# 通过委托控制进度条以及多线程更新控件
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.Threading;
- namespace Demo0004
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- //线程开始的时候调用的委托
- private delegate void maxValueDelegate(int maxValue);
- //线程执行中调用的委托
- private delegate void nowValueDelegate(int nowValue);
- private void button1_Click(object sender, EventArgs e)
- {
- ThreadMethod method = new ThreadMethod();
- //先订阅一下事件
- method.threadStartEvent += new EventHandler(method_threadStartEvent);
- method.threadEvent += new EventHandler(method_threadEvent);
- method.threadEndEvent += new EventHandler(method_threadEndEvent);
- Thread thread = new Thread(new ThreadStart(method.runMethod));
- thread.Start();
- }
- /// <summary>
- /// 线程开始事件,设置进度条最大值
- /// 但是我不能直接操作进度条,需要一个委托来替我完成
- /// </summary>
- /// <param name="sender">ThreadMethod函数中传过来的最大值</param>
- /// <param name="e"></param>
- void method_threadStartEvent(object sender, EventArgs e)
- {
- int maxValue = Convert.ToInt32(sender);
- maxValueDelegate max = new maxValueDelegate(setMax);
- this.Invoke(max, maxValue);
- }
- /// <summary>
- /// 线程执行中的事件,设置进度条当前进度
- /// 但是我不能直接操作进度条,需要一个委托来替我完成
- /// </summary>
- /// <param name="sender">ThreadMethod函数中传过来的当前值</param>
- /// <param name="e"></param>
- void method_threadEvent(object sender, EventArgs e)
- {
- int nowValue = Convert.ToInt32(sender);
- nowValueDelegate now = new nowValueDelegate(setNow);
- this.Invoke(now, nowValue);
- }
- /// <summary>
- /// 线程完成事件
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- void method_threadEndEvent(object sender, EventArgs e)
- {
- MessageBox.Show("执行已经完成!");
- }
- /// <summary>
- /// 我被委托调用,专门设置进度条最大值的
- /// </summary>
- /// <param name="maxValue"></param>
- private void setMax(int maxValue)
- {
- this.progressBar1.Maximum = maxValue;
- }
- /// <summary>
- /// 我被委托调用,专门设置进度条当前值的
- /// </summary>
- /// <param name="nowValue"></param>
- private void setNow(int nowValue)
- {
- this.progressBar1.Value = nowValue;
- }
- }
- public class ThreadMethod
- {
- /// <summary>
- /// 线程开始事件
- /// </summary>
- public event EventHandler threadStartEvent;
- /// <summary>
- /// 线程执行时事件
- /// </summary>
- public event EventHandler threadEvent;
- /// <summary>
- /// 线程结束事件
- /// </summary>
- public event EventHandler threadEndEvent;
- public void runMethod()
- {
- int count = 100; //执行多少次
- threadStartEvent.Invoke(count, new EventArgs());//通知主界面,我开始了,count用来设置进度条的最大值
- for (int i = 0; i < count; i++)
- {
- Thread.Sleep(100);//休息100毫秒,模拟执行大数据量操作
- threadEvent.Invoke(i, new EventArgs());//通知主界面我正在执行,i表示进度条当前进度
- }
- threadEndEvent.Invoke(new object(), new EventArgs());//通知主界面我已经完成了
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.Threading;
- namespace Demo0004
- {
- public partial class Form2 : Form
- {
- //在下载窗体上面 建一个委托
- public delegate void ChangeProgress(int value); //进度条
- public delegate void ChangeButton(int value); //按钮
- //创建上面的委托的变量
- public ChangeProgress changeProgerss;
- public ChangeButton changebtn;
- public Form2()
- {
- InitializeComponent();
- //为这个委托变量赋值
- changeProgerss = FunChangeProgress;
- changebtn = FunChangebutton;
- }
- //通过创建工作线程消除用户界面线程的阻塞问题
- private void button1_Click(object sender, EventArgs e)
- {
- button1.Enabled = false;
- //新创建一个线程
- System.Threading.Thread thr = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Download));
- thr.Start();
- }
- //线程方法 一定要是object 类型参数 同时返回值是void
- private void Download(object obj)
- {
- for (int i = 0; i <= 100; i++)
- {
- //执行委托 更新按钮 -重点
- this.button1.Invoke(changebtn, i);
- //执行委托 更新进度条 -重点
- this.progressBar1.Invoke(changeProgerss, i);
- System.Threading.Thread.Sleep(100);
- }
- }
- //更新进度条
- public void FunChangeProgress(int value)
- {
- progressBar1.Value = value;
- }
- //更新按钮
- public void FunChangebutton(int value)
- {
- if (value == 100)
- {
- button1.Text = "开始新进程";
- button1.Enabled = true;
- }
- else
- {
- //相除保留两位小数 且四舍五入 Math.Round(1.00 * value / 100, 2,MidpointRounding.AwayFromZero)
- button1.Text = Math.Round(1.00 * value / 100, 2,MidpointRounding.AwayFromZero) * 100 + "%";
- }
- }
- //窗体关闭 强制退出 销毁所有相关进程
- private void Form2_FormClosing(object sender, FormClosingEventArgs e)
- {
- //强制退出 销毁进程
- System.Environment.Exit(System.Environment.ExitCode);
- this.Dispose();
- this.Close();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- namespace Demo0004
- {
- public partial class Form3 : Form
- {
- public delegate void ChangeStatus();
- //创建上面的委托的变量
- public ChangeStatus changestatus;
- public Form3()
- {
- InitializeComponent();
- }
- private void Form3_Load(object sender, EventArgs e)
- {
- //使用Timer组件实现多线程定时同步
- System.Timers.Timer t = new System.Timers.Timer(3000); //实例化Timer类,设置间隔时间单位毫秒;
- t.Elapsed += new System.Timers.ElapsedEventHandler(UpdateWork); //到达时间的时候执行事件;
- t.AutoReset = true; //设置是执行一次(false)还是一直执行(true);
- t.Enabled = true; //是否执行System.Timers.Timer.Elapsed事件;
- changestatus = FunChangeStatus;
- }
- private void UpdateWork(object source, System.Timers.ElapsedEventArgs e)
- {
- this.Invoke(changestatus);
- }
- //更新
- public void FunChangeStatus()
- {
- #region 更新开始
- //更新方法
- #endregion
- lbtimer.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 数据更新成功";
- }
- }
- }

C# 通过委托控制进度条以及多线程更新控件的更多相关文章
- 进度条的使用 Progress控件
MFC编程实例二:进度条的使用 2011-03-22 09:09:09| 分类: C++(C语言) | 标签:进度 nlower nupper 添加 mfc |字号 订阅 本人用的 ...
- 安卓MP3播放器开发实例(3)之进度条和歌词更新的实现
上一次谈了音乐播放的实现,这次说下最复杂的进度条和歌词更新.因为须要在播放的Activity和播放的Service间进行交互,所以就涉及了Activity对Service的绑定以及绑定后数据的传输,这 ...
- C# winform编程中多线程操作控件方法
private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...
- winform多线程调用控件
对多线程操作控件的理解: 控件不能被非创造他的线程修改.需调用控件.beginvoke,注入UI线程.控件.beginvoke会把操作加入UI线程,阻塞画面响应.不要把耗时的计算放在控件.beginv ...
- COM组件开发实践(八)---多线程ActiveX控件和自动调整ActiveX控件大小(下)
源代码下载:MyActiveX20081229.rar 声明:本文代码基于CodeProject的文章<A Complete ActiveX Web Control Tutorial>修改 ...
- COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)
声明:本文代码基于CodeProject的文章<A Complete ActiveX Web Control Tutorial>修改而来,因此同样遵循Code Project Open L ...
- [寒江孤叶丶的Cocos2d-x之旅_33]RichTextEx一款通过HTML标签控制文字样式的富文本控件
RichTextEx一款通过HTML标签控制文字样式的富文本控件 原创文章,欢迎转载.转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列] 博客地址:http://blog.csdn.net ...
- C#创建子线程,子线程使用委托更新控件
一.背景 由于在窗体程序中通过点击一个button按键后需要更新TreeView控件的内容,由于等待时间比较长,主程序无法一起在那边等待,需要去处理其它的事情,所以就需要创建新的子线程来处理.因为主线 ...
- C# 通过线程来控制进度条(转)--讲解多线程对界面的操作
// 通过创建委托解决传递参数问题 private void _btnRun_Click( object sender, System.EventArgs e ) { RunTaskDelegate ...
随机推荐
- 浅谈开源项目Android-Universal-Image-Loader(Part 3.1)
本文转载于:http://www.cnblogs.com/osmondy/p/3266023.html 浅谈开源项目Android-Universal-Image-Loader(Part 3.1) 最 ...
- lucene文件格式待整理
这是之前Lucene3.0生成的索引格式 a表
- 你足够了解Context吗?
你足够了解Context吗? 这里有关于Context的一切-写在前面: 当我还是一个24K纯Android新手的时候(现在是也是个小Android萌新),拿着工具书对着电脑敲敲打打,那个时候我就有一 ...
- UDP/TCP通信小记
TCP 和UDP的区别 TCP是面向连接的; 所谓连接 就是 打开的时候要握手,收发数据的时候要确认(传说中的窗口协议保持滑动过去的窗口都已成功发送,接收方已经成功接收). UDP是无连接的. 所 ...
- debug,trace,release项目配置区别
Debug模式是用来调试用的,它生成的执行文件中含有大量调试信息,所以很大: Release模式生成的执行文件消除了这些调试信息,可用来作为成品发布 Debug只在debug状态下会输出,Trace在 ...
- oracle sqlplus及常用sql语句
常用sql语句 有需求才有动力 http://blog.csdn.net/yitian20000/article/details/6256716 常用sql语句 创建表空间:create tables ...
- Linux-Load blance
在实际应用中,在Web服务器集群之前总会有一台负载均衡服务器,负载均衡设备的任务就是作为Web服务器流量的入口,挑选最合适的一台Web服务器,将客户端的请求转发给它处理,实现客户端到真实服务端的透明转 ...
- 006 [翻译] Haneke(一个Swfit iOS缓存类)
Github项目地址:https://github.com/Haneke/HanekeSwift Haneke是一个用swift写成的轻量级iOS类,以简单好用著称(design-decisions- ...
- Spring MVC与Struts2的区别
1. 机制:spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同. 2. 性能:spring会稍微比struts快.spring mvc是基于方法的设 ...
- hibernate 自生双向一对多 多对一管理 (树)
<span style="font-size: large;">package com.javacrazyer.test; import java.io.Seriali ...