c# 定时器

定时器

1、一共有三种

  • System.Windows.Forms.Timer:这个就是窗体中直接拖拽的那个,定时不准确,且会卡主线程和主线程使用同一个线程
  • 定义在System.Timers.Timer 这个和下面那个是多线程定时器,定时准确,不会卡主线程
  • System.Threading.Timer

直接代码设置(System.Windows.Forms.Timer)

int i=0;
System.Timers.Timer DTimer;

DTimer = new System.Timers.Timer(1000);//实例化Timer类,设置间隔时间为100毫秒;
DTimer.Elapsed += new System.Timers.ElapsedEventHandler(DataTimeHandle);//到达时间的时候执行事件;
DTimer.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
DTimer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
        //定时去opencv读取图片 100ms执行一次
        public void DataTimeHandle(object source, System.Timers.ElapsedEventArgs e)
        {
            try
            {
                DTimer.Enabled = false;//NI 暂停的意思吧 等这段代码执行完了再开启
                if (this.IsHandleCreated) 
                { 
                    this.Invoke((EventHandler)delegate
                    {
  						pictureBox7.Image = bitmap              
                    });
               }
               DTimer.Enabled = true;
            }
            catch(Exception ee)
            {
                DTimer.Enabled = true;
                Console.WriteLine("come in =="+ee.Message);
            }
        }

设置好走之前关闭

        public TestSFR()
        {
            InitializeComponent();

            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);

        }
        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            DTimer.Enabled = false;
            //BitmapRead.Release();
        }

控制台上不知道为什么没有成功 在winform上下次试试看

直接添加一个(System.Windows.Forms.Timer)

创建并设置属性,如果enabled了就会一直循环执行 中断服务函数
在这里插入图片描述
代码中的位置
在这里插入图片描述
编辑中断服务函数
在这里插入图片描述

实验现象,每隔0.5s 多一个点 一直持续下去
在这里插入图片描述

遇到的一些问题

1、就是你在定时器里面增加一个while 循环
在这里插入图片描述
解决办法(线程也可以这样解决)虽然不是最优的,但是可以这样解决。
就是使用switch 然后 一个case执行(然后case++进入等待case) 一个case等待(到完成了就进入下面一个case 执行下面的代码)

Thread.Sleep(2000);

可以使用Thread.Sleep(2000);使线程休眠,这个时候拖动 界面会出现卡顿现象
我感觉定时器回调函数这个线程就是和主线程一个线程 所以里面休眠了会卡界面 因为如果要休眠要等待的话 还是直接用多线程比较好。

        private void timer1_Tick(object sender, EventArgs e)
        {
            Debug.WriteLine( "进入定时器");
            timer1.Enabled = false;
            Thread.Sleep(2000);//使线程休眠
            Debug.WriteLine("退出定时器");
            timer1.Enabled = true;
        }

在这里插入图片描述

计时

方法1:精度高
方法1:

using System.Runtime.InteropServices;
        [DllImport("winmm")]
        static extern void timeBeginPeriod(int t);
        [DllImport("winmm")]
        static extern void timeEndPeriod(int t);
        [DllImport("winmm")]
        static extern uint timeGetTime();
            timeBeginPeriod(1);
            uint start = timeGetTime();
            Thread.Sleep(2719);
            MessageBox.Show((timeGetTime() - start).ToString());  //单位毫秒
            timeEndPeriod(1);

在这里插入图片描述
方法2:精度低点,代码少

        [System.Runtime.InteropServices.DllImport("kernel32")]
        static extern uint GetTickCount();
            uint s1 = GetTickCount();
            Thread.Sleep(2719);
            MessageBox.Show((GetTickCount() - s1).ToString());  //单位毫秒

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成草

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值