设置首页收藏本站
开启左侧

winform 中 定时器 委托 , 帮个忙吧!

[复制链接]
amnoone 发表于 2018-12-15 20:38:47 | 显示全部楼层 |阅读模式
定时器  、委托,  单个的都知道   要在一起用 总是线程报错
  
  1. private void button4_Click(object sender, EventArgs e)
  2.         {
  3.             timer_test1.Elapsed += new System.Timers.ElapsedEventHandler(changetext);
  4.             timer_test1.AutoReset = true;
  5.             timer_test1.Enabled = true;
  6.         }


  7.          public void changetext(object source, System.Timers.ElapsedEventArgs e)
  8.          {
  9.              n += 1;
  10.              button4.Text = n.ToString();
  11.              if (n > 1000)
  12.              {
  13.                  n = 0;
  14.              }

  15.          }
复制代码


报线程  错误  ,知道 用  委托。自己试了好久 ,越试越晕。   其中 把 委托相关代码 去掉了(因为还是报错,没有真正理解)。
不想用    Control.CheckForIllegalCrossThreadCalls = false;  屏蔽    这次 是时候  认真学学了。
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
zhy29563 发表于 2018-12-16 09:58:08 | 显示全部楼层
control.invokerequired
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| amnoone 发表于 2018-12-16 11:33:16 | 显示全部楼层
这个 知道 , 但是不透 。 能具体些吗?
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
Suione 发表于 2019-1-14 09:31:44 | 显示全部楼层
注册的timer事件是新建立的一个线程,所以在要用委托,你可以参考下我改的,网上也有很多实例,可以自己对比看看

  1. public partial class Form1 : Form
  2.     {
  3.          System.Timers.Timer timer_test1=new System.Timers.Timer ();        
  4.         public Form1()
  5.         {
  6.             InitializeComponent();
  7.         }

  8.         private void button1_Click(object sender, EventArgs e)
  9.         {
  10.          
  11.             timer_test1.Enabled = true;
  12.             timer_test1.Start();
  13.         }

  14.         private void Form1_Load(object sender, EventArgs e)
  15.         {
  16.             timer_test1.Elapsed += new System.Timers.ElapsedEventHandler(changetext);
  17.             timer_test1.Interval = 1000;
  18.             timer_test1.AutoReset = true;
  19.         }

  20.         private int n = 0;
  21.         public delegate void BtnDisplay(string msg); //声明委托
  22.         public void changetext(object sender, System.Timers.ElapsedEventArgs e)
  23.         {
  24.             n += 1;
  25.             showmsg(n.ToString ()); //调用委托方法
  26.             if (n > 1000)
  27.             {
  28.                 n = 0;
  29.             }

  30.         }

  31.         private void showmsg(string msg)
  32.         {
  33.             if (button1.InvokeRequired )
  34.             {
  35.                 BtnDisplay BtnDisplay = showmsg;
  36.                 this.Invoke(BtnDisplay ,new object[] { msg});              
  37.             }
  38.             else
  39.             {
  40.                 button1 .Text = msg;

  41.             }
  42.         }
  43.     }
复制代码
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
丶初吻给了奶嘴 发表于 2019-2-19 11:50:10 | 显示全部楼层
关键还是InvokeRequired
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表