在编程中,经常会碰到需要做到如下功能:

1.有一个不定时执行的方法A,在执行时需要判断距离上一次执行过了多长时间,如果超过三秒就继续执行,如果小于三秒就退出。

2.有一个不定时执行的A方法和B方法,假设:A方法执行完成后,如果3秒内B方法没有被执行,那么就执行C方法,如果在3秒内执行了B方法,那么就执行D方法。(A方法重复执行时分两种,一种是重复执行会刷新3秒的等待时间【简单】,还有一种是不刷新3秒等待时间【复杂】。

解决方式:

问题1解决:

分析:只需要在每次执行A方法的时候开始计时,下一次执行的时候进行停止计时,判断时间,然后开启新的计时

System.Diagnostics.Stopwatch stopwatch = new Stopwatch();
public void A()
{stopwatch.Start(); //  开始监视代码运行时间if(stopwatch.IsRunning)//刷新等待时间{stopwatch.Stop();if (stopwatch.Elapsed.TotalSeconds > 3){//执行需要执行的功能}else{//小于三秒不执行}stopwatch.Restart();}
}

问题2解决:

分析:在问题2中,主要判断的是,在执行B方法时,需要判断距离A方法执行完后是不是过了3秒,如果是3秒内,就执行D,反之执行C。需要注意的是,B方法不一定会执行,还有可能A方法不一定执行

解决1:重复执行会刷新3秒等待时间,利用Stopwatch即可实现计算时间

举例①:1s:A事件执行           3s:A事件执行 (刷新时间)            5s:B事件执行

判断:距离最新A事件执行小于三秒,执行D事件

举例②:1s:A事件执行           5s:B事件执行

判断:距离A事件执行大于三秒,第4s时执行C事件

解决代码:

System.Diagnostics.Stopwatch stopwatch = new Stopwatch();
public void A()
{stopwatch.Start(); //  开始监视代码运行时间if(stopwatch.IsRunning)//刷新等待时间{stopwatch.Restart();}
}
public void B()
{stopwatch.Stop();if (stopwatch.Elapsed.TotalSeconds > 3){//执行C方法}else{//执行D方法}
}

解决2:重复执行不会刷新等待时间,也就是每次执行A事件都要判断3秒内是否执行了B事件,需要时刻监听B事件。需要做到:

B事件执行的时候看最近3秒有没有A事件执行,有的话就执行D

A事件过了三秒后判断是不是在这三秒内执行了B,没有的话就执行C

举例①:1s:A事件执行           3s:A事件执行             5s:B事件执行

判断:距离第一次的A事件执行大于三秒,距离第二次的A事件执行小于三秒,在第4s时执行一次C事件,在第5s时执行一次D事件

举例②:1s:A事件执行           3s:A事件执行             7s:B事件执行

判断:距离第一次和第二次的A事件执行都大于三秒,在第4s时执行第一次C事件,在第6s时执行第二次C事件

解决代码:

List<DateTime> listdate = new List<DateTime>();//记录开始定时的时间
List<System.Timers.Timer> listtime = new List<System.Timers.Timer>();//存储定时器
List<bool> listif = new List<bool>();//判断是否执行过B方法
public void A()
{System.Timers.Timer time = new System.Timers.Timer();time.Interval = Convert.ToInt32(3000);time.Elapsed += new System.Timers.ElapsedEventHandler(guoban);time.AutoReset = false;//设置是执行一次(false)还是一直执行(true); time.Enabled = true;listdate.Add(DateTime.Now);listtime.Add(time);listif.Add(false);
}
public void B()
{for (int i = listdate.Count-1; i >0; i--){if((DateTime.Now-listdate[i]).TotalSeconds<=3){//执行D方法richTextBox1.AppendText("执行D\r\n");listif[i] = true;}if((DateTime.Now - listdate[i]).TotalSeconds > 5)//之前的内容就不需要判断了{break;}}
}
public void guoban(object source, System.Timers.ElapsedEventArgs e)
{for (int i = listdate.Count - 1; i > -1; i--){if ((DateTime.Now - listdate[i]).TotalSeconds <= 4 && (DateTime.Now - listdate[i]).TotalSeconds >= 3)//判断最近的几次是不是执行过了,但是要确保是已经过了三秒的了{if(!listif[i]){//执行C方法richTextBox1.AppendText("执行C\r\n");listif[i] = true;}}if ((DateTime.Now - listdate[i]).TotalSeconds > 5)//之前的内容就不需要判断了{break;}}
}

利用定时器做防止误触发功能以及多久后执行某个事件相关推荐

  1. 解决JS双击事件dblclick触发时,同时会执行click事件中的语句

    双击dblclick事件,同时会执行click事件中的语句,当需要为一个元素同时添加这两个事件时,显然这不是我们想要的结果,举个实例,在最近做的canvas开发中使用鼠标画区域,鼠标单击一下开始画,鼠 ...

  2. 定时器误触发功能详解

    前言 新青瓷之秘色.窑变主要围绕着主角张仲平展开,从侄子徐艺的背叛,再到和记者曾真的婚外情,整部书的脉络其实并不复杂,阅读起来也比较轻松.所以剖析这本书的故事可以分成两部分,即张仲平的商业斗争和张仲平 ...

  3. python自己做个定时器_技术图文:如何利用 Python 做一个简单的定时器类?

    原标题:技术图文:如何利用 Python 做一个简单的定时器类? 背景 今天在B站上看有关 Python 最火的一个教学视频 -- "零基础入门学习 Python",这也是我们 P ...

  4. 在java里四舍五入怎么做_利用java怎么实现一个四舍五入功能

    利用java怎么实现一个四舍五入功能 发布时间:2020-12-02 16:46:08 来源:亿速云 阅读:68 作者:Leah 这期内容当中小编将会给大家带来有关利用java怎么实现一个四舍五入功能 ...

  5. 怎么用python编写个apk_【android】如何利用python做Android项目自动化构建,并一键实现构建结果发送到钉钉通知以及通过二维码下载apk或者其他处理等功能...

    今天我们来谈一谈用python做Android项目自动化构建的过程.我们知道在常规的Android开发过程中,开发人员打包的时候需要在Android Studio当中进行,或者通过gradle命令,但 ...

  6. php 全选 反选,利用vue实现全选反选功能

    这次给大家带来利用vue实现全选反选功能,利用vue实现全选反选功能的注意事项有哪些,下面就是实战案例,一起来看一下. 全选功能可以说是前端开发中非常常见的一个功能,以前的项目开发用jQuery开发比 ...

  7. 关于用51单片机内部定时器实现时钟和闹钟功能的概述

    关于用51单片机内部定时器实现时钟和闹钟功能的概述 仅个人观点,欢迎大家相互学习和讨论 STC89C52单片机,内部配置了三个定时器,T0\T1\T2,其中T2定时器我们几乎不用,或者说很少用到.我们 ...

  8. STM32基本定时器做万能遥控器

    STM32基本定时器做万能遥控器 使用资源介绍 基本思路 捕获NEC输入波形 输出存储的NEC波形 部分代码 总结 使用资源介绍 1:基本定时器:定时计数的功能 2:外部中断:下降沿上升沿触发方式,进 ...

  9. 机器人误触发动作监控原因分析

    动作监控功能,也就是通常我们所说的碰撞保护功能,可以减少碰撞对机器人产生的影响力.目前主流机器人上都有类似的碰撞保护的功能.ABB机器人称这个功能叫做"动作监控". 对于碰撞保护, ...

最新文章

  1. 3.9 降低DFT泄露的一种办法---加窗
  2. Hacker:编写高级语言脚本可破解各个云盘的下载速度限制
  3. PHP微信支付没有收到微信的回调怎么修改订单状态:主动查询
  4. 树的遍历 | 翻转二叉树
  5. 【C++ grammar】重载、内联、变量作用域、带默认参数的函数
  6. 深入解析TRUNCATE TABLE – 手工修复和验证过程
  7. 远程办公 4 大坑,坑坑“致命”!
  8. QT显示图片和中途修改图片
  9. LoadRunner 11简单使用
  10. 安卓手机状态栏 定位服务自动关闭_【科普知识】手机多久关机一次?看完才知道白用那么多年手机了!...
  11. vue常用的几个框架
  12. 怀念《100部经典动漫大回顾》 你还记得几部?(附图)
  13. AFL++: Combining Incremental Steps of Fuzzing Research
  14. java int类型能表示的数值范围
  15. Python调用Jar包的两种方式
  16. CentOS7上Glusterfs的安装及使用(gluster/heketi)
  17. 高仿 IOS遨游哈哈最新版
  18. sqoop从orc文件到oracle,Sqoop import as OrC file
  19. 学会如何管理和保护布线系统
  20. ssl- 套接字对象的TLS / SSL包装器

热门文章

  1. vs + ffmpeg------待续
  2. MYSQL使用存储过程插入中文数据的疑似bug(UTF8)
  3. 【Linux】使用xshell登陆时密码框为灰色,无法输入密码
  4. Spark机器学习(9):FPGrowth算法
  5. [Swift]NSString、NSData、Base64互转
  6. MySQL基础篇:逻辑架构
  7. 用敏捷开发工具leangoo管理需求看板示例
  8. TiDB 在中通的落地与进化
  9. 最全干货:从写简历,到面试、谈薪酬的那些技巧和防坑指南
  10. 应对618,京东到家订单系统高可用架构的迭代实战