一个高效的,精确的定时器,应该是什么样子的?

varlj 2013-08-01 09:35:23
平时做些要求不高的定时要求的任务,一般用个Timer就搞定了,比如20:00点响个闹钟什么的

今天突然想到,如果我对于定时的要求很高,很精确,比如低于1ms的误差,又比如任务的执行时间比较长,或者定时的时间离当前时间相当长,那一直开着个Timer过段时间比较下时间,总觉得傻傻的。而且Timer消息在Windows消息中是属于优先级比较低的消息,要是卡一下,很容易就错过时间了。

所以想请教一下:

1.一个高效的,精确的定时器,应该会是什么样子的?
2.如果有成百上千的定时任务,还是需要一个个去比对时间?
3.以前做过51单片机,可以通过计数器来来触发中断实现较精确的定时任务,PC中是否也有类似的技术呢?

...全文
615 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
superfireware 2013-08-03
  • 打赏
  • 举报
回复
路过学习
varlj 2013-08-02
  • 打赏
  • 举报
回复
我看大家都在回复怎么取得更精确的时候,这些我倒是明白的,其实我比较好奇的是,比如我有一个100个定时任务,那是不是得开个线程不停的去比较时间,时间对上了,另开个线程去执行任务,有没别的比较好的方法呢? 其实我用不着这么高精度的定时器,纯粹昨天用到定时器的时候突然想到这么些问题,自己不知道答案,所以问问而已。
SocketUpEx 2013-08-02
  • 打赏
  • 举报
回复
[DllImport("Kernel32.dll")] private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); [DllImport("Kernel32.dll")] private static extern bool QueryPerformanceFrequency(out long lpFrequency);
烈火蜓蜻 2013-08-02
  • 打赏
  • 举报
回复
用Threads.Timer。基本上可以做到。 参考一下, http://blog.csdn.net/linux7985/article/details/9301163 比如:定时到9:0:0秒的话, 基本上可以在 9:0:0.0080,可以启动,也就是在10毫秒以内吧。 策略的话,就是计算到目标时间有需要多长,然后休眠到指定的时间,然后开始运行, 但是定时时间,只支持到秒,不支持到某个毫秒的时间。
PaulyJiang 2013-08-02
  • 打赏
  • 举报
回复
难道楼主做军工的 要求如此高
gengchenhui 2013-08-02
  • 打赏
  • 举报
回复
精确到毫秒,恐怕windows做不到,其他不知道什么系统可以做到。。。
gengchenhui 2013-08-02
  • 打赏
  • 举报
回复
时间精确到毫秒???
threenewbee 2013-08-02
  • 打赏
  • 举报
回复
引用 3 楼 varlj 的回复:
[quote=引用 2 楼 devmiao 的回复:] GetTickCount API
那不是Environment.TickCount么?那还不如QueryPerformanceCount。 我想知道怎么去设计[/quote] 如果你需要精度足够高,可以使用CPU的TSC计数器的值,精确到1/CPU时钟频率,对于现在GHz级别的处理器,精确到纳秒。
gomoku 2013-08-02
  • 打赏
  • 举报
回复
做不了的。 Windows操作系统是‘抢占式多任务(Preemptive mutitasking)’系统。 也就是说在20:00点的时候,你的程序可能连运行的机会都没有。 取决于系统调度的粒度,可能在12毫秒后,你的程序才再次被分配到的时间片。
Benjay77 2013-08-02
  • 打赏
  • 举报
回复
system.Thread.Timer?
烈火蜓蜻 2013-08-02
  • 打赏
  • 举报
回复
引用 15 楼 varlj 的回复:
[quote=引用 14 楼 Linux7985 的回复:] [quote=引用 13 楼 varlj 的回复:] 我看大家都在回复怎么取得更精确的时候,这些我倒是明白的,其实我比较好奇的是,比如我有一个100个定时任务,那是不是得开个线程不停的去比较时间,时间对上了,另开个线程去执行任务,有没别的比较好的方法呢? 其实我用不着这么高精度的定时器,纯粹昨天用到定时器的时候突然想到这么些问题,自己不知道答案,所以问问而已。
我不是给你个连接了吗? 1、更好的办法就是计算当前的时间到要执行的时间之间的时间间隔,然后休眠到那个时间,开始就执行,不用一直比较的, 2、如果有100个定时任务,当然就用100个定时器喽,一个任务一个定时器, 或者100个定时任务用一个定时器,那这个就需要动动你的脑子了,就是要给100个任务排时间,然后用定时器定时到这100个任务中第一个要执行的任务,然后再继续定时到第二个任务,这个就很麻烦了,因为你还要考虑到突然加了一个任务,或是突然移除一个任务,你的定时器都需要重新校准。[/quote] 谢谢,不过Sleep并不能保证准时醒来,不过确实有启发,谢谢[/quote] 不是用Sleep,是用Threads.Timer这个类, 这个类的时间误差大概是在20毫秒左右, 还不够吗? Windows是分时系统你想再精确也不可能让线程调度的精度小于系统调度的时间片。 window系统的运行的时间片大概是20毫秒左右,因此你想让定时器醒来的时间与目标时间小于1毫秒,这个不可能,除非你调整Window的时间片长度。 如果你真要高精度的,你应该用实时系统,而不是分时系统。
varlj 2013-08-02
  • 打赏
  • 举报
回复
引用 14 楼 Linux7985 的回复:
[quote=引用 13 楼 varlj 的回复:] 我看大家都在回复怎么取得更精确的时候,这些我倒是明白的,其实我比较好奇的是,比如我有一个100个定时任务,那是不是得开个线程不停的去比较时间,时间对上了,另开个线程去执行任务,有没别的比较好的方法呢? 其实我用不着这么高精度的定时器,纯粹昨天用到定时器的时候突然想到这么些问题,自己不知道答案,所以问问而已。
我不是给你个连接了吗? 1、更好的办法就是计算当前的时间到要执行的时间之间的时间间隔,然后休眠到那个时间,开始就执行,不用一直比较的, 2、如果有100个定时任务,当然就用100个定时器喽,一个任务一个定时器, 或者100个定时任务用一个定时器,那这个就需要动动你的脑子了,就是要给100个任务排时间,然后用定时器定时到这100个任务中第一个要执行的任务,然后再继续定时到第二个任务,这个就很麻烦了,因为你还要考虑到突然加了一个任务,或是突然移除一个任务,你的定时器都需要重新校准。[/quote] 谢谢,不过Sleep并不能保证准时醒来,不过确实有启发,谢谢
烈火蜓蜻 2013-08-02
  • 打赏
  • 举报
回复
引用 13 楼 varlj 的回复:
我看大家都在回复怎么取得更精确的时候,这些我倒是明白的,其实我比较好奇的是,比如我有一个100个定时任务,那是不是得开个线程不停的去比较时间,时间对上了,另开个线程去执行任务,有没别的比较好的方法呢? 其实我用不着这么高精度的定时器,纯粹昨天用到定时器的时候突然想到这么些问题,自己不知道答案,所以问问而已。
我不是给你个连接了吗? 1、更好的办法就是计算当前的时间到要执行的时间之间的时间间隔,然后休眠到那个时间,开始就执行,不用一直比较的, 2、如果有100个定时任务,当然就用100个定时器喽,一个任务一个定时器, 或者100个定时任务用一个定时器,那这个就需要动动你的脑子了,就是要给100个任务排时间,然后用定时器定时到这100个任务中第一个要执行的任务,然后再继续定时到第二个任务,这个就很麻烦了,因为你还要考虑到突然加了一个任务,或是突然移除一个任务,你的定时器都需要重新校准。
wanghui0380 2013-08-01
  • 打赏
  • 举报
回复
越高效,越精准,那么他其实就是很简单的振荡电路 比如你的电子表(晶体振荡电路) pc功能复杂,一般多任务,所以嘛自然没那么严格。如果要严格你还真的就得去玩那种简单电路的东西
varlj 2013-08-01
  • 打赏
  • 举报
回复
引用 2 楼 devmiao 的回复:
GetTickCount API
那不是Environment.TickCount么?那还不如QueryPerformanceCount。 我想知道怎么去设计
devmiao 2013-08-01
  • 打赏
  • 举报
回复
GetTickCount API
weizhuangwen 2013-08-01
  • 打赏
  • 举报
回复

//我想到的是:
while(true)
{
if(你设定的时间==当前时间)
{
break;
}
}
Ninja 是一个由 Google 开发的高效的大规模项目构建系统,专门用于加速软件构建过程。它设计简单,性能优异,被广泛用于构建许多知名的开源项目,如 Chromium、LLVM 等。Ninja 的优势和特点:简单易用:Ninja 的配置文件非常简洁明了,语法简单,易于理解和维护。相比其他构建工具如 Make 或 CMake,Ninja 的语法更加清晰,学习曲线较为平缓。高效性能:Ninja 以速度著称。它采用了高效的算法和并行构建机制,在大型项目中能够显著提高构建速度。Ninja 不会像一些其他构建工具那样浪费时间在重新构建不必要的文件上。轻量级:Ninja 是一个轻量级的构建系统,不依赖于其他复杂的工具链。它本身只是一个单独的可执行文件,不需要额外的库或依赖。跨平台支持:Ninja 可以在各种操作系统上运行,包括 Linux、Windows 和 macOS 等。这使得它成为一个便携且灵活的构建工具,能够满足不同平台下的需求。可扩展性:尽管 Ninja 本身比较简单,但它具有良好的可扩展性。开发者可以通过编写自定义的构建规则或插件来扩展 Ninja 的功能,以满足特定项目的需求。适合大型项目:Ninja 的高效性能和并行构建特性使其特别适用于大型项目。它能够处理成千上万个源文件,并在多核系统上充分利用硬件资源,从而加快构建过程。黄强老师针对零编程基础的同学,精心打磨ninja核心知识点,帮助你快速掌握Linux编程中的ninja的工具构建!适用人群: 零基础、新手、想快速学习Linux下C、C++编程的童鞋! 

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧