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. UVa 1593代码对齐

    原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  2. Codeforces Round #138 (Div. 2)

    A. Parallelepiped 枚举其中一边,计算其他两条边. B. Array 模拟. C. Bracket Sequence 栈. D. Two Strings \(pre[i]\)表示第i个 ...

  3. hdu3342 拓扑序

    题意:一个QQ群里面有一群大神,他们互相帮助解决问题,然后互相膜拜,于是有些人就称别人是他师父,现在给出很多师徒关系,问是否有矛盾 拓扑序,按师徒关系建边直接拓扑序就行了. #include<s ...

  4. MFC-CString 字符串分割

    CString strSrc = _T("1++2+3+4"); CStringArray strResult; CString strGap = _T("+" ...

  5. node.js BootStrap安装

    最近想用Bootstrap开发项目,以便使用其丰富的资源: 捯饬了一下nodejs的安装和配置:windows下弄起来还是比较狗屎的,两三天下班时间才弄好: http://xiaoyaojones.b ...

  6. 如何在Windows 下安装Python

    1.  安装源程序的选择 官网:https://www.python.org/downloads/ 选择版本下载,根据实际计算机位数(64位),下载的为: Python-2.7.10.amd64.ms ...

  7. 虚拟化之vmware虚拟机扩容与克隆

    前提条件: 1.在新建虚拟机的时候创建磁盘如下图,之后这个磁盘就可以在虚拟机关机状态下动态扩展大小,否则只能通过添加另外一块硬盘的方式来扩容.

  8. OpenJudge计算概论-二维数组右上左下遍历

    /*====================================================================== 二维数组右上左下遍历 总时间限制: 1000ms 内存 ...

  9. 【转载】onclick与onCommand的区别

    这两个事件没有本质区别,都是点击执行一个事件.不同在于传递的参数不一 样,OnClick (object sender, EventArgs e),OnCommand (object sender, ...

  10. PostgreSQL数据的导出导入

    PostgreSQL数据的导出导入 导出PostgreSQL数据库中的数据: $ pg_dump -U postgres  -f mydatabase.sql  mydatabase 导入数据时首先创 ...