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. html---文本框样式;

    一.一个单行文本框的例子 <form name="form1" action="mailto:3400982550@qq.com" method=&quo ...

  2. ed编辑器使用

    evilxr@IdeaPad:/tmp$ ed aa.c 0 a enter another words hello nice www.evilxr.com . w aa.c 46 q a 表示添加内 ...

  3. rectangle类。java

    import java.util.Scanner; class rectangle{    int l,w;    rectangle(int lon,int wid){    l=lon;    w ...

  4. ps命令详解(转)

    原文地址:http://apps.hi.baidu.com/share/detail/32573968 有时候系统管理员可能只关心现在系统中运行着哪些程序,而不想知道有哪些进程在运行.由于一个应用程序 ...

  5. Java 操作Excel 之Poi(第一讲)

    1.Poi 简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能.HSSF - 提供读写Micros ...

  6. 如何在WTL和MFC中使用duilib及如何静态使用duilib库!(初级讲解 附带一个Demo)

    关于duilib的历史,我也就不多说了,能看到这篇文章的人都是有一定了解才能找到这个的. 我直接说下对这个库的基本使用吧. 我个人对一些好技术都是比较感兴趣的. 因为个人原因 喜欢接触一个好技术. 所 ...

  7. docker安装错误

    转载:http://www.roddypy.com/index.php/2016/03/11/centos7-yum-%E5%AE%89%E8%A3%85docker%E6%8A%A5%E9%94%9 ...

  8. syslog syslog-ng rsyslog flume scribe 各种尝试

    1. syslog概念 syslog本身是一种协议, 一个用来描述系统日志格式的协议, 当前的协议包括三部分: 如下面是一个syslog消息: <30>Oct 9 22:33:20 hlf ...

  9. SQLServer三种自定义函数

    自定义函数"是我们平常的说法,而"用户定义的函数"是 SQL Server 中书面的说法. SQL Server 2000 允许用户创建自定义函数,自定义函数可以有返回值 ...

  10. 题目1049:字符串去特定字符——九度OJ

    题目1049:字符串去特定字符 http://ac.jobdu.com/problem.php?pid=1049 时间限制:1 秒 内存限制:32 兆 题目描述: 输入字符串s和字符c,要求去掉s中所 ...