C#使用Environment.TickCount 自定义的定时器类
Environment.TickCount,
官网介绍:一个 32 位带符号整数,它包含自上次启动计算机以来所经过的时间(以毫秒为单位)。
*由于 TickCount 属性值的值是32位有符号整数,因此,如果系统连续运行,TickCount 将从零递增到 Int32.MaxValue 大约24.9 天,然后跳转到 Int32.MinValue,这是一个负数,然后在下一个24.9 天内递增为零。
我们可以通过实时获取系统启动后的毫秒数来实现定时器的定时功能;
首先建立一个Timer类,声明变量如下:
enum_State State;//定时器State
int startTime; //开始时间
int endTime; //结束时间
int interval; //定时间隔
int stopTime; //停止时间
int pauseTime; //暂停时间
bool outMax; //是否超出Int32.MaxValue
定时器状态如下,初始状态为Idle:
enum enum_State
{
_Idle,
_Busy,
_TimeOut,
_Stopped,
_Pause
}
定时器开始启动函数,定时参数为整数,单位ms:
public void Start(int time)
{
if (time <= )
time = ;
interval = time;
startTime = Environment.TickCount;
endTime = startTime + interval;
State = enum_State._Busy;
stopTime = ;
pauseTime = ;
outMax = endTime < startTime;
}
定时器停止函数:
public void Stop()
{
if (IsBusy() || IsPause())
stopTime = Environment.TickCount;
State = enum_State._Stopped;
endTime = ;
pauseTime = ;
}
暂停定时器:
public void Pause()
{
if (pauseTime == )
pauseTime = Environment.TickCount;
State = enum_State._Pause;
}
继续定时器:
public void Resume()
{
if (!IsPause())
return;
int val = pauseTime;
startTime = Environment.TickCount - val;
endTime = startTime + interval;
State = enum_State._Busy;
pauseTime = ;
stopTime = ;
outMax = endTime < startTime;
}
重置定时器:
public void Reset()
{
interval = ;
startTime = ;
endTime = ;
pauseTime = ;
stopTime = ;
State = enum_State._Idle;
}
判断是否超时:
public bool IsTimeOut()
{
int ticks = Environment.TickCount;
if (outMax)
{
if (ticks < startTime)
outMax = false;
}
if (!outMax && !IsPause())
{
if (IsBusy() && (ticks > endTime || ticks <= && endTime > && startTime > ))
{
stopTime = endTime;
State = enum_State._TimeOut;
}
}
return State == enum_State._TimeOut;
}
下面在程序中实例化一个Timer类timer1,并实现定时2s发送消息:
public void Monitor()
{
timer1.Start(*);
while (true)
{
Thread.Sleep();
//int i = Thread.CurrentThread.ManagedThreadId;
if (timer1.IsTimeOut())
{
comUp.comPort_SendData(textBox_ComSend.Text);
timer1.Start(*);
}
}
}
看一下定时效果:
因为调用Winform窗台显示,线程执行,逻辑判断等需要一些时间,所以显示有一些偏差;
如官网介绍,使用Environment.TickCount时,注意24.9天左右会达到Int32.MaxValue,然后跳转到Int32.MinValue,再经过24.9天达到0,要注意对负数的处理;
C#使用Environment.TickCount 自定义的定时器类的更多相关文章
- C# winform中自定义精确定时器(经测试稳定可靠)
原C#的定时器时间越长,误差越大. 在主动请求设备数据的使用,使用C#的几种自带定时器导致每天都会丢失几条数据. 经测试使用自定义的定时器可完全解决此问题. 使用方法: MillisecondTime ...
- Android 自定义Activity基类与TitleBar
我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字.TitleBar上的点击事件,如果给每一个Activity都写一遍 ...
- hadoop编程小技巧(5)---自定义输入文件格式类InputFormat
Hadoop代码测试环境:Hadoop2.4 应用:在对数据需要进行一定条件的过滤和简单处理的时候可以使用自定义输入文件格式类. Hadoop内置的输入文件格式类有: 1)FileInputForma ...
- WPF自定义窗口基类
WPF自定义窗口基类时,窗口基类只定义.cs文件,xaml文件不定义.继承自定义窗口的类xaml文件的根节点就不再是<Window>,而是自定义窗口类名(若自定义窗口与继承者不在同一个命名 ...
- Silverlight实例教程 - 自定义扩展Validation类,验证框架的总结和建议(转载)
Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...
- 利用NSUserdefaults来存储自定义的NSObject类及自定义类数组
利用NSUserdefaults来存储自定义的NSObject类及自定义类数组 1.利用NSUserdefaults来存储自定义的NSObject类 利用NSUserdefaults也可以来存储及获取 ...
- NSTimer定时器类
NSTimer是Cocoa中比较常用的定时器类,基本操作如下: handleTimer方法可以自行定义.在需要的地方创建timer即可,handleTimer就可以每0.5秒执行一次. - (vo ...
- 安卓开发37:自定义的HorizontalScrollView类,使其pageScroll的时候焦点不选中
自定义一个HorizontalScrollView类,主要为了让这个HorizontalScrollView不能鼠标点击,不能左右按键,并且没有焦点. public class ImageMoveHo ...
- WPF自学入门(九)WPF自定义窗口基类
今天简单记录一个知识点:WPF自定义窗口基类,常用winform的人知道,winform的窗体继承是很好用的,写一个基础窗体,直接在后台代码改写继承窗体名.但如果是WPF要继承窗体,我个人感觉没有理解 ...
随机推荐
- python 封装底层实现原理
事实上,python封装特性的实现纯属"投机取巧",之所以类对象无法直接调用私有方法和属性,是因为底层实现时,python偷偷改变了它们的名称. python在底层实现时,将它们的 ...
- 【数据结构】FHQ Treap详解
FHQ Treap是什么? FHQ Treap,又名无旋Treap,是一种不需要旋转的平衡树,是范浩强基于Treap发明的.FHQ Treap具有代码短,易理解,速度快的优点.(当然跟红黑树比一下就是 ...
- HGE引擎改进
基于HGEDX9版本修改. hge库: 1.全UNICODE化 2.增加时间模块:Timer_StartTick(),Timer_NowTick()等六个函数 3.增加服从正态分布的随机数生成函数:R ...
- C# winform 弹框提示内存不足
看了下面一片博文解决的 Winform 内存不足Winform,我给PictureBox 赋值 picBox_One.BackgroundImage = Image.FromFile("图片 ...
- Dubbo入门到实战
前沿:在当下流行的分布式架构中Dubbo是非常流行的一门技术,借着这几天有空学习学习,并在后面的项目中进行实战,为后面的分布式项目做铺垫. Dubbox简介 Dubbox 是一个分布式服务框架,其前身 ...
- Nginx核心模块
error_log 语法:error_log file [ debug | info | notice | warn | error | crit ]默认值:${prefix}/logs/error. ...
- (笔记)常用Llinu命令(一)
Linux资源 鸟哥Linux:http://linux.vbird.org/linux_basic/ Linux命令大全:https://man.linuxde.net/ 目录切换 cd usr: ...
- vue简介,插值表达式,过滤器
目录 VUE框架介绍 what?什么是vue? why?为什么要学习vue? special特点? how如何使用? 下载安装? 导入方式? 挂在点el 插值表达式 delimiters自定义插值表达 ...
- css:html-font-size
font-family:"Helvetica Neue",Helvetica,Arial,sans-serif
- 导弹拦截(dp复习)
题目描述:求最长下降子序列的长度 in: 71 7 3 5 9 4 8 out: 4 解释:1 3 4 8/1 3 5 8 长度为四 这让我想到了hdu上导弹拦截那道题,是求最长上升子序列长度 其转移 ...