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. php部分---函数、四类常用函数、例子(下拉菜单添加内容);

    1.简单函数 四要素:返回类型,函数名,参数列表,函数体 function Show() { echo "hello"; } Show(); 2.有返回值的函数 function ...

  2. Python简史

    Python简史 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python是我喜欢的语言,简洁,优美,容易使用.前两天,我很激 ...

  3. jQuery显示隐藏动态效果的几种写法

    <script type="text/javascript"> $(document).ready(function() {     /*$("#test1& ...

  4. [AMPPZ 2013]Bytehattan

    先把题目链接贴在这里喵~ http://main.edu.pl/en/archive/amppz/2013/baj 话说真是一道让我严重怀疑我的智商的好题目, 话说此题第一感觉.嗯?似乎离线做做就可以 ...

  5. spring源码学习之:spring容器的applicationContext启动过程

    Spring 容器像一台构造精妙的机器,我们通过配置文件向机器传达控制信息,机器就能够按照设定的模式进行工作.如果我们将Spring容器比喻为一辆汽车,可以将 BeanFactory看成汽车的发动机, ...

  6. ubuntu下nfs服务器的安装与配置

    nfs服务器的安装和配置 1.安装nfs 服务器,前提是你的系统能连上网. 2.设置/etc/exports配置文件 (1) 进入/etc/exports配置文件 (2) 在最后一行加入红色那行,/h ...

  7. Attention and Augmented Recurrent Neural Networks

    Attention and Augmented Recurrent Neural Networks CHRIS OLAHGoogle Brain SHAN CARTERGoogle Brain Sep ...

  8. JSBinding + SharpKit / Coroutine支持

    首先得深入了解协程的原理.如果还没有完全理解,建议看这篇: http://wiki.unity3d.com/index.php/CoroutineScheduler 另外还要对 JavaScript ...

  9. 转载:javascript 拖拽排序,简洁示例备忘

    转载自:http://blog.csdn.net/wang4978/article/details/6721157 <html> <head> <title>拖动行 ...

  10. ComboPooledDataSource 连接池耗完

    这里发现时由于代码里手动加载 ApplicationContext.xml文件造成的: 问题代码: ApplicationContext context = new ClassPathXmlAppli ...