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 自定义的定时器类的更多相关文章

  1. C# winform中自定义精确定时器(经测试稳定可靠)

    原C#的定时器时间越长,误差越大. 在主动请求设备数据的使用,使用C#的几种自带定时器导致每天都会丢失几条数据. 经测试使用自定义的定时器可完全解决此问题. 使用方法: MillisecondTime ...

  2. Android 自定义Activity基类与TitleBar

    我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字.TitleBar上的点击事件,如果给每一个Activity都写一遍 ...

  3. hadoop编程小技巧(5)---自定义输入文件格式类InputFormat

    Hadoop代码测试环境:Hadoop2.4 应用:在对数据需要进行一定条件的过滤和简单处理的时候可以使用自定义输入文件格式类. Hadoop内置的输入文件格式类有: 1)FileInputForma ...

  4. WPF自定义窗口基类

    WPF自定义窗口基类时,窗口基类只定义.cs文件,xaml文件不定义.继承自定义窗口的类xaml文件的根节点就不再是<Window>,而是自定义窗口类名(若自定义窗口与继承者不在同一个命名 ...

  5. Silverlight实例教程 - 自定义扩展Validation类,验证框架的总结和建议(转载)

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  6. 利用NSUserdefaults来存储自定义的NSObject类及自定义类数组

    利用NSUserdefaults来存储自定义的NSObject类及自定义类数组 1.利用NSUserdefaults来存储自定义的NSObject类 利用NSUserdefaults也可以来存储及获取 ...

  7. NSTimer定时器类

    NSTimer是Cocoa中比较常用的定时器类,基本操作如下: handleTimer方法可以自行定义.在需要的地方创建timer即可,handleTimer就可以每0.5秒执行一次.   - (vo ...

  8. 安卓开发37:自定义的HorizontalScrollView类,使其pageScroll的时候焦点不选中

    自定义一个HorizontalScrollView类,主要为了让这个HorizontalScrollView不能鼠标点击,不能左右按键,并且没有焦点. public class ImageMoveHo ...

  9. WPF自学入门(九)WPF自定义窗口基类

    今天简单记录一个知识点:WPF自定义窗口基类,常用winform的人知道,winform的窗体继承是很好用的,写一个基础窗体,直接在后台代码改写继承窗体名.但如果是WPF要继承窗体,我个人感觉没有理解 ...

随机推荐

  1. redis 数据类型之列表

    1.lpush lpush(name,values) # 在name对应的list中添加元素,每个新的元素都添加到列表的最左边 # 如: # conn.lpush('oo', 11,22,33) # ...

  2. 解决jar包依赖冲突(idea)

    在IDEA状态下查看项目依赖的关系 关系如下图 红色数据jar包冲突 在对应的依赖中出去去冲突依赖

  3. ffifdyop——绕过中一个奇妙的字符串

    根据师傅们的博客总结如下: ffifdyop 经过md5加密后:276f722736c95d99e921722cf9ed621c 再转换为字符串:'or'6<乱码>  即  'or'66� ...

  4. 软件工程概论 网站开发要掌握的技术 &登录界面

    1.网站系统开发需要掌握的技术 一.界面和用户体验(Interface and User Experience) 1.1 知道如何在基本不影响用户使用的情况下升级网站.通常来说,你必须有版本控制系统( ...

  5. python接口自动化测试 - openpyxl封装类

    前言 为了更好的让openpyxl在工作中使用,将openpyxl的常用操作封装起来,这样不仅复用性高,而且阅读性好 直接上代码 #!/usr/bin/env python # -*- coding: ...

  6. Python学习,第五课 - 列表、字典、元组操作

    本篇主要详细讲解Python中常用的列表.字典.元组相关的操作 一.列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 通过下标获取元素 #先定义一个列表 le ...

  7. [HNOI2008]明明的烦恼(prufer序列,高精度,质因数分解)

      prufer序列 定义 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2. 描述 eg 将 ...

  8. ios---剪裁圆形图片方法

    剪裁圆形图片 - (instancetype)xmg_circleImage { // 1.开启图形上下文 // 比例因素:当前点与像素比例 UIGraphicsBeginImageContextWi ...

  9. SSM 配置文件 分析

    spring 配置文件(主要整合的是spring 和 mybatis 的配置文件) 问题: 两者之间没有整合在一起的时候是怎么样的 spring配置文件:    Spring配置文件是用于指导Spri ...

  10. linux 内存使用分析

      查看当前内存使用情况,最常用的指令就是 [root@t ~]# free -m total used free shared buffers cached Mem: -/+ buffers/cac ...