1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Threading;
  10. namespace Demo0004
  11. {
  12. public partial class Form1 : Form
  13. {
  14. public Form1()
  15. {
  16. InitializeComponent();
  17. }
  18. //线程开始的时候调用的委托
  19. private delegate void maxValueDelegate(int maxValue);
  20. //线程执行中调用的委托
  21. private delegate void nowValueDelegate(int nowValue);
  22. private void button1_Click(object sender, EventArgs e)
  23. {
  24. ThreadMethod method = new ThreadMethod();
  25. //先订阅一下事件
  26. method.threadStartEvent += new EventHandler(method_threadStartEvent);
  27. method.threadEvent += new EventHandler(method_threadEvent);
  28. method.threadEndEvent += new EventHandler(method_threadEndEvent);
  29. Thread thread = new Thread(new ThreadStart(method.runMethod));
  30. thread.Start();
  31. }
  32. /// <summary>
  33. /// 线程开始事件,设置进度条最大值
  34. /// 但是我不能直接操作进度条,需要一个委托来替我完成
  35. /// </summary>
  36. /// <param name="sender">ThreadMethod函数中传过来的最大值</param>
  37. /// <param name="e"></param>
  38. void method_threadStartEvent(object sender, EventArgs e)
  39. {
  40. int maxValue = Convert.ToInt32(sender);
  41. maxValueDelegate max = new maxValueDelegate(setMax);
  42. this.Invoke(max, maxValue);
  43. }
  44. /// <summary>
  45. /// 线程执行中的事件,设置进度条当前进度
  46. /// 但是我不能直接操作进度条,需要一个委托来替我完成
  47. /// </summary>
  48. /// <param name="sender">ThreadMethod函数中传过来的当前值</param>
  49. /// <param name="e"></param>
  50. void method_threadEvent(object sender, EventArgs e)
  51. {
  52. int nowValue = Convert.ToInt32(sender);
  53. nowValueDelegate now = new nowValueDelegate(setNow);
  54. this.Invoke(now, nowValue);
  55. }
  56. /// <summary>
  57. /// 线程完成事件
  58. /// </summary>
  59. /// <param name="sender"></param>
  60. /// <param name="e"></param>
  61. void method_threadEndEvent(object sender, EventArgs e)
  62. {
  63. MessageBox.Show("执行已经完成!");
  64. }
  65. /// <summary>
  66. /// 我被委托调用,专门设置进度条最大值的
  67. /// </summary>
  68. /// <param name="maxValue"></param>
  69. private void setMax(int maxValue)
  70. {
  71. this.progressBar1.Maximum = maxValue;
  72. }
  73. /// <summary>
  74. /// 我被委托调用,专门设置进度条当前值的
  75. /// </summary>
  76. /// <param name="nowValue"></param>
  77. private void setNow(int nowValue)
  78. {
  79. this.progressBar1.Value = nowValue;
  80. }
  81. }
  82. public class ThreadMethod
  83. {
  84. /// <summary>
  85. /// 线程开始事件
  86. /// </summary>
  87. public event EventHandler threadStartEvent;
  88. /// <summary>
  89. /// 线程执行时事件
  90. /// </summary>
  91. public event EventHandler threadEvent;
  92. /// <summary>
  93. /// 线程结束事件
  94. /// </summary>
  95. public event EventHandler threadEndEvent;
  96. public void runMethod()
  97. {
  98. int count = 100;      //执行多少次
  99. threadStartEvent.Invoke(count, new EventArgs());//通知主界面,我开始了,count用来设置进度条的最大值
  100. for (int i = 0; i < count; i++)
  101. {
  102. Thread.Sleep(100);//休息100毫秒,模拟执行大数据量操作
  103. threadEvent.Invoke(i, new EventArgs());//通知主界面我正在执行,i表示进度条当前进度
  104. }
  105. threadEndEvent.Invoke(new object(), new EventArgs());//通知主界面我已经完成了
  106. }
  107. }
  108. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Threading;
  10. namespace Demo0004
  11. {
  12. public partial class Form2 : Form
  13. {
  14. //在下载窗体上面 建一个委托
  15. public delegate void ChangeProgress(int value); //进度条
  16. public delegate void ChangeButton(int value); //按钮
  17. //创建上面的委托的变量
  18. public ChangeProgress changeProgerss;
  19. public ChangeButton changebtn;
  20. public Form2()
  21. {
  22. InitializeComponent();
  23. //为这个委托变量赋值
  24. changeProgerss = FunChangeProgress;
  25. changebtn = FunChangebutton;
  26. }
  27. //通过创建工作线程消除用户界面线程的阻塞问题
  28. private void button1_Click(object sender, EventArgs e)
  29. {
  30. button1.Enabled = false;
  31. //新创建一个线程
  32. System.Threading.Thread thr = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(Download));
  33. thr.Start();
  34. }
  35. //线程方法 一定要是object 类型参数 同时返回值是void
  36. private void Download(object obj)
  37. {
  38. for (int i = 0; i <= 100; i++)
  39. {
  40. //执行委托 更新按钮  -重点
  41. this.button1.Invoke(changebtn, i);
  42. //执行委托 更新进度条  -重点
  43. this.progressBar1.Invoke(changeProgerss, i);
  44. System.Threading.Thread.Sleep(100);
  45. }
  46. }
  47. //更新进度条
  48. public void FunChangeProgress(int value)
  49. {
  50. progressBar1.Value = value;
  51. }
  52. //更新按钮
  53. public void FunChangebutton(int value)
  54. {
  55. if (value == 100)
  56. {
  57. button1.Text = "开始新进程";
  58. button1.Enabled = true;
  59. }
  60. else
  61. {
  62. //相除保留两位小数 且四舍五入 Math.Round(1.00 * value / 100, 2,MidpointRounding.AwayFromZero)
  63. button1.Text = Math.Round(1.00 * value / 100, 2,MidpointRounding.AwayFromZero) * 100 + "%";
  64. }
  65. }
  66. //窗体关闭 强制退出 销毁所有相关进程
  67. private void Form2_FormClosing(object sender, FormClosingEventArgs e)
  68. {
  69. //强制退出 销毁进程
  70. System.Environment.Exit(System.Environment.ExitCode);
  71. this.Dispose();
  72. this.Close();
  73. }
  74. }
  75. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. namespace Demo0004
  10. {
  11. public partial class Form3 : Form
  12. {
  13. public delegate void ChangeStatus();
  14. //创建上面的委托的变量
  15. public ChangeStatus changestatus;
  16. public Form3()
  17. {
  18. InitializeComponent();
  19. }
  20. private void Form3_Load(object sender, EventArgs e)
  21. {
  22. //使用Timer组件实现多线程定时同步
  23. System.Timers.Timer t = new System.Timers.Timer(3000);   //实例化Timer类,设置间隔时间单位毫秒;
  24. t.Elapsed += new System.Timers.ElapsedEventHandler(UpdateWork); //到达时间的时候执行事件;
  25. t.AutoReset = true;   //设置是执行一次(false)还是一直执行(true);
  26. t.Enabled = true;     //是否执行System.Timers.Timer.Elapsed事件;
  27. changestatus = FunChangeStatus;
  28. }
  29. private void UpdateWork(object source, System.Timers.ElapsedEventArgs e)
  30. {
  31. this.Invoke(changestatus);
  32. }
  33. //更新
  34. public void FunChangeStatus()
  35. {
  36. #region 更新开始
  37. //更新方法
  38. #endregion
  39. lbtimer.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 数据更新成功";
  40. }
  41. }
  42. }

C# 通过委托控制进度条以及多线程更新控件的更多相关文章

  1. 进度条的使用 Progress控件

    MFC编程实例二:进度条的使用 2011-03-22 09:09:09|  分类: C++(C语言) |  标签:进度  nlower  nupper  添加  mfc  |字号 订阅    本人用的 ...

  2. 安卓MP3播放器开发实例(3)之进度条和歌词更新的实现

    上一次谈了音乐播放的实现,这次说下最复杂的进度条和歌词更新.因为须要在播放的Activity和播放的Service间进行交互,所以就涉及了Activity对Service的绑定以及绑定后数据的传输,这 ...

  3. C# winform编程中多线程操作控件方法

    private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...

  4. winform多线程调用控件

    对多线程操作控件的理解: 控件不能被非创造他的线程修改.需调用控件.beginvoke,注入UI线程.控件.beginvoke会把操作加入UI线程,阻塞画面响应.不要把耗时的计算放在控件.beginv ...

  5. COM组件开发实践(八)---多线程ActiveX控件和自动调整ActiveX控件大小(下)

    源代码下载:MyActiveX20081229.rar 声明:本文代码基于CodeProject的文章<A Complete ActiveX Web Control Tutorial>修改 ...

  6. COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)

    声明:本文代码基于CodeProject的文章<A Complete ActiveX Web Control Tutorial>修改而来,因此同样遵循Code Project Open L ...

  7. [寒江孤叶丶的Cocos2d-x之旅_33]RichTextEx一款通过HTML标签控制文字样式的富文本控件

    RichTextEx一款通过HTML标签控制文字样式的富文本控件 原创文章,欢迎转载.转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列] 博客地址:http://blog.csdn.net ...

  8. C#创建子线程,子线程使用委托更新控件

    一.背景 由于在窗体程序中通过点击一个button按键后需要更新TreeView控件的内容,由于等待时间比较长,主程序无法一起在那边等待,需要去处理其它的事情,所以就需要创建新的子线程来处理.因为主线 ...

  9. C# 通过线程来控制进度条(转)--讲解多线程对界面的操作

    // 通过创建委托解决传递参数问题 private void _btnRun_Click( object sender, System.EventArgs e ) { RunTaskDelegate ...

随机推荐

  1. Codeforces Round #147 (Div. 2)

    A. Free Cash 判断值相同的最长长度. B. Young Table 按从上到下,从左到右排序,每个位置最多交换一次. C. Primes on Interval \(p_i\)表示位置\( ...

  2. Codeforces Round #129 (Div. 2)

    A. Little Elephant and Rozdil 求\(n\)个数中最小值的个数及下标. B. Little Elephant and Sorting \[\sum_{i=1}^{n-1}{ ...

  3. HDU-1255 覆盖的面积 (扫描线)

    题目大意:给若干个矩形,统计重叠次数不为0的面积. 题目分析:维护扫描线的长度时,只需要只统计覆盖次数大于1的区间即可.这是个区间更新,不过不能使用懒标记,但是数据规模不大,不用懒惰标记仍可以AC. ...

  4. win7win8一键取得超级管理员权限

    win7win8有时会出现删除不了文件的情况,弹窗提示需要某某权限,下面为解决办法: 在普通帐户中快速获得最高的权限: 新建一个.txt文本,将下面的代码复制粘贴到文件中,另存为或重命名为.reg文件 ...

  5. 单例模式-ios

    #import <Foundation/Foundation.h> @interface UserContext : NSObject <NSCopying> @propert ...

  6. unity, collider/trigger on children

    参考:http://answers.unity3d.com/questions/410711/trigger-in-child-object-calls-ontriggerenter-in-pa.ht ...

  7. 移动web 应用开发调试

    调试前端页面我一直使用着神器Chrome开发人员工具, 那个方便, 大家都懂的. 但当我们要调试为移动设备设计的Web页面时, 是不是觉得有点力不从心了?平时开发时我们可以一直都是在桌面调试这个页面, ...

  8. 【转】 CSS3阴影 box-shadow的使用和技巧总结

    text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果.随着html5和CSS3的普及,这一特殊效果使用越来越普遍. 基本语法是{box-shadow:[inset ...

  9. DW(二):SqlServer PDW

    当微软发布第一个SQL Server并行数据仓库R2时(SQL ServerParallel Data Warehouse,即PDW),已正式将产品的名称修改为分析服务平台(APS),但在一些非正式场 ...

  10. rsync配置中的auth error,一个隐秘的错误

    我们都知道rsync是linux自带的功能强大的文件同步协议. 为了做免密码文件同步,所以,有多种配置.但是种种配置中,可能会遇到一个让人很纠结的问题,那就是安全认证错误的问题! 这个配置,是基于rs ...