• 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事件;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
            //定时去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);
                }
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    设置好走之前关闭

            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();
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    控制台上不知道为什么没有成功 在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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    计时

    方法1:精度高
    方法1:

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

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

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

    在这里插入图片描述

  • 相关阅读:
    【高并发】深度解析线程池中那些重要的顶层接口和抽象类
    CSDN每日一练 |『生命进化书』『订班服』『c++难题-大数加法』2023-09-06
    小程序setData动态传递key
    java专家系统房产营销智能推荐系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    【好书分享第十一期】深入Rust标准库(文末送书)
    【信号处理】卡尔曼滤波(Matlab代码实现)
    Markdown使用方法
    【java|golang】1662. 检查两个字符串数组是否相等
    美创科技亮相第三届国际零信任峰会,零信任实践获安全革新奖
    【权限管理项目总结】SpringBoot+MyBatis+Shiro+EhCache+Thymeleaf:编码+功能测试+知识点
  • 原文地址:https://blog.csdn.net/chengcao123/article/details/127411232