昨天突然遇到定时器到底是如何实现的这个问题,一个本来很浅显的东西,立刻变得含混起来,回家查了LINXU内核的定时器实现机制,非但没有弄清楚,倒好,更糊涂了。
在LINUX下,使用了硬件计时器进行时钟中断,和软件插值的方法实现,其中的区别很大,而且硬件中断也有几种方法,这里咱们先不弄LINUX下的,回头有时间我会整理一下。先讲一下WINDOWS下的定时器的原理,我们不讲使用,使用的方法MSDN和网上都滥了。
经过这两天的仔细查看MSDN和网络资料,个人认为WINDOWS下的定时器可以分三种,即在MSDN中的系统服务、线程、UI。其实这是在NET上才实现的。我个人认为在NET前的使用上根本就是只有一种,即UI。不管你是不是有UI,其实实现的方法都是用UI的方法实现的。至于WINDOWS内部如何操作硬件,这个我们不做深入了解,也没有必要。即使你天天做驱动,估计深入了解这个东西的作用也没有太大,当然,如果你给微软写或修改这部分代码就另外算了。
MSDN上说,前两种,使用 TimerCallback 委托指定希望 Timer 执行的方法。计时器委托在构造计时器时指定,并且不能更改。此方法不在创建计时器的线程上执行,而是在系统提供的 ThreadPool 线程上执行。这个清楚明白的说明了,定时器是在多线程上执行的,但UI计时器则不同,Timer 用于以用户定义的事件间隔触发事件。Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。
Windows 窗体 Timer 组件是单线程组件,精度限定为 55 毫秒。如果您需要更高精度的多线程计时器,请使用 System.Timers 命名空间中的 Timer 类。
上面都是MSDN上的原话,大家可以自己看。
原文地址:http://fpcfjf.blog.163.com/blog/static/554697932010021104210508/