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. Django2.0 配置 media

    1.setting.py文件 MEDIA_URL='/media/' MEDIA_ROOT=os.path.join(BASE_DIR,"media") 注意:MEDIA_ROOT ...

  2. Matplotlib从兴趣到实践

    先看下Matplotlib实现的效果 是不是出现了也想敲一个的心动,那让我们一起来了解Matplotlib吧 Matplotlib安装 1.Windows系统安装Matplotlib 进入到cmd的命 ...

  3. [bzoj3938] [Uoj #88] Robot

    Description 小 \(q\) 有 \(n\) 只机器人,一开始他把机器人放在了一条数轴上,第 \(i\) 只机器人在 \(a_i\) 的位置上静止,而自己站在原点.在这之后小 \(q\) 会 ...

  4. mysql使用唯一索引避免插入重复数据

    使用MySQL 索引防止一个表中的一列或者多列产生重复值 一:介绍MYSQL唯一索引 如果要强烈使一列或多列具有唯一性,通常使用PRIMARY KEY约束. 但是,每个表只能有一个主键. 因此,如果使 ...

  5. MVC 记录

    ASP.NET MVC框架提供了一个帮助我们构造Html元素的类:TagBuilder ps url cnblogs.com/yibinboy/articles/5187682.html HttpRu ...

  6. C++ 对TXT 的串并行读写

    任务说明:有36篇文档,现在要读入,并统计词频,字典长度25,希望能够比较串并行读写操作的时间差距. 串行读入并统计词频 // LoadDocsInUbuntu.cpp // #include < ...

  7. Spring相关jar说明

    Spring整合使用说明 一.只是使用spring框架 dist\spring.jar lib\jakarta-commons\commons-logging.jar 如果使用到了切面编程(AOP), ...

  8. 痞子衡嵌入式:ARM Cortex-M内核那些事(3.3)- 为AI,ML而生(M55)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ARM Cortex-M55. 鼠年春节,大家都在时刻关心 2019nCoV 疫情发展,没太多心思搞技术,就在这个时候,ARM 不声不响 ...

  9. Unreal Engine 4 蓝图完全学习教程(三)—— 节点的基本知识

    Ⅰ.节点的种类 ①标题:在节点的上方显示着节点的标题,标题部分会根据节点类型显示不同的颜色. ②输入:用于从其他节点接收数据以获取必要的数值. ③输出:将这个节点计算出结果用于传递数值到其他节点. ( ...

  10. Spring(六)核心容器 - 注册单例 Bean 实例、SingletonBeanRegistry 简介

    前言 上篇文章我们对注册 Bean 的核心类 BeanDefinitionRegistry 进行了讨论,这里的注册 Bean 是指保存 Bean 的相关信息,也就是将 Bean 定义成 BeanDef ...