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. 转:Struts标签checkbox使用总结(默认选择设置)

    在使用struts标签html:checkbox 的时候,如何让checkbox框默认是选中的,一般情况 下都是当formbean里面该property的值和标签上value给定的值相等的时候,生成的 ...

  2. QAQ

    贴吧怎么了最近多了一些脑残帖子 回答完问题你追我 ? 你追你mb你车费都凑不够. 答着答着你也许就哭了 我哭你mb 老子脑袋又没病 . 英国最最虐心的调查 ,我虐你mb还英国 你出过省吗? 晚上回家 ...

  3. 创建kafkatopic和productor

    cd 到kafka 目录下 创建topic create topicbin/kafka-topics.sh --zookeeper spark1:2181,spark2:2181,spark3:218 ...

  4. HDU-1520 Anniversary party(树形DP)

    题目大意:一棵树,每个节点都带权.从中取出一些节点,并且子节点不能与父节点同时取,求能取得的最大值. 题目分析:定义状态dp(u,0/1)表示u点不取/取.则状态转移方程为: dp(u,1)=sum( ...

  5. 黑马程序员——JAVA基础之final this.和super.的区别

    ------- android培训.java培训.期待与您交流! ----------  final关键字: final可以修饰类,方法,变量. final修饰的类不可以被继承. final修饰的方法 ...

  6. java多线程:jdk并发包的总结(转载)

    转载地址:http://blog.csdn.net/yangbutao/article/details/8479520 1.java 高并发包所采用的几个机制(CAS,volatile,抽象队列同步) ...

  7. java基础之:匿名内部类应用例子一

    一:接口 package com.yeepay.sxf.testclassforinner; /** * 回调接口. * @author shangxiaofei * */ public interf ...

  8. javascrip中的confirm小技巧

    jsp页面中的一个标签: <a href="javascript:void(0)" onclick="confirmDelete('<%=request.ge ...

  9. 归档-ios

    /****普通对象归档**/ NSString *homePath=NSHomeDirectory(); NSString *fileName=@"test.vse"; NSStr ...

  10. Avoiding PostgreSQL database corruption

    TL;DR: Don't ever set fsync=off, don't kill -9 the postmaster then deletepostmaster.pid, don't run P ...