一个高效的,精确的定时器,应该是什么样子的? //我想到的是:while(true){if(你设定的时间==当前时间){break;}} 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 那不是Environment.TickCount么?那还不如QueryPerformanceCount。我想知道怎么去设计 做不了的。Windows操作系统是‘抢占式多任务(Preemptive mutitasking)’系统。也就是说在20:00点的时候,你的程序可能连运行的机会都没有。取决于系统调度的粒度,可能在12毫秒后,你的程序才再次被分配到的时间片。 那不是Environment.TickCount么?那还不如QueryPerformanceCount。我想知道怎么去设计如果你需要精度足够高,可以使用CPU的TSC计数器的值,精确到1/CPU时钟频率,对于现在GHz级别的处理器,精确到纳秒。 精确到毫秒,恐怕windows做不到,其他不知道什么系统可以做到 用Threads.Timer。基本上可以做到。参考一下,http://blog.csdn.net/linux7985/article/details/9301163比如:定时到9:0:0秒的话, 基本上可以在 9:0:0.0080,可以启动,也就是在10毫秒以内吧。策略的话,就是计算到目标时间有需要多长,然后休眠到指定的时间,然后开始运行,但是定时时间,只支持到秒,不支持到某个毫秒的时间。 [DllImport("Kernel32.dll")] private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); [DllImport("Kernel32.dll")] private static extern bool QueryPerformanceFrequency(out long lpFrequency); 我不是给你个连接了吗?1、更好的办法就是计算当前的时间到要执行的时间之间的时间间隔,然后休眠到那个时间,开始就执行,不用一直比较的,2、如果有100个定时任务,当然就用100个定时器喽,一个任务一个定时器,或者100个定时任务用一个定时器,那这个就需要动动你的脑子了,就是要给100个任务排时间,然后用定时器定时到这100个任务中第一个要执行的任务,然后再继续定时到第二个任务,这个就很麻烦了,因为你还要考虑到突然加了一个任务,或是突然移除一个任务,你的定时器都需要重新校准。谢谢,不过Sleep并不能保证准时醒来,不过确实有启发,谢谢 我不是给你个连接了吗?1、更好的办法就是计算当前的时间到要执行的时间之间的时间间隔,然后休眠到那个时间,开始就执行,不用一直比较的,2、如果有100个定时任务,当然就用100个定时器喽,一个任务一个定时器,或者100个定时任务用一个定时器,那这个就需要动动你的脑子了,就是要给100个任务排时间,然后用定时器定时到这100个任务中第一个要执行的任务,然后再继续定时到第二个任务,这个就很麻烦了,因为你还要考虑到突然加了一个任务,或是突然移除一个任务,你的定时器都需要重新校准。谢谢,不过Sleep并不能保证准时醒来,不过确实有启发,谢谢不是用Sleep,是用Threads.Timer这个类,这个类的时间误差大概是在20毫秒左右, 还不够吗? Windows是分时系统你想再精确也不可能让线程调度的精度小于系统调度的时间片。 window系统的运行的时间片大概是20毫秒左右,因此你想让定时器醒来的时间与目标时间小于1毫秒,这个不可能,除非你调整Window的时间片长度。如果你真要高精度的,你应该用实时系统,而不是分时系统。 百万级数据插入数据库 <%什么意思 什么用 急啊!!! 有没有办法指定调用的OleDB是32位还是64位? 用c#如何产生随机数 请教:C# 调用JAVASCRIPT函数时,函数报错,前台界面调用却正常。 初学者 这个不明白 我的程序有如下并发问题: 快过年了,sqlserver版好热闹啊! 怎么把函数地址转换成委托调用的函数? 怎么实现VB中的Modules(模块)? 向Form添加控件的一点点疑惑。。。。 自定义控件重绘问题!
也就是说在20:00点的时候,你的程序可能连运行的机会都没有。取决于系统调度的粒度,可能在12毫秒后,你的程序才再次被分配到的时间片。
http://blog.csdn.net/linux7985/article/details/9301163
比如:定时到9:0:0秒的话, 基本上可以在 9:0:0.0080,可以启动,也就是在10毫秒以内吧。
策略的话,就是计算到目标时间有需要多长,然后休眠到指定的时间,然后开始运行,
但是定时时间,只支持到秒,不支持到某个毫秒的时间。
private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); [DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceFrequency(out long lpFrequency);
我不是给你个连接了吗?
1、更好的办法就是计算当前的时间到要执行的时间之间的时间间隔,然后休眠到那个时间,开始就执行,不用一直比较的,
2、如果有100个定时任务,当然就用100个定时器喽,一个任务一个定时器,
或者100个定时任务用一个定时器,那这个就需要动动你的脑子了,就是要给100个任务排时间,然后用定时器定时到这100个任务中第一个要执行的任务,然后再继续定时到第二个任务,这个就很麻烦了,因为你还要考虑到突然加了一个任务,或是突然移除一个任务,你的定时器都需要重新校准。谢谢,不过Sleep并不能保证准时醒来,不过确实有启发,谢谢
我不是给你个连接了吗?
1、更好的办法就是计算当前的时间到要执行的时间之间的时间间隔,然后休眠到那个时间,开始就执行,不用一直比较的,
2、如果有100个定时任务,当然就用100个定时器喽,一个任务一个定时器,
或者100个定时任务用一个定时器,那这个就需要动动你的脑子了,就是要给100个任务排时间,然后用定时器定时到这100个任务中第一个要执行的任务,然后再继续定时到第二个任务,这个就很麻烦了,因为你还要考虑到突然加了一个任务,或是突然移除一个任务,你的定时器都需要重新校准。谢谢,不过Sleep并不能保证准时醒来,不过确实有启发,谢谢
不是用Sleep,是用Threads.Timer这个类,
这个类的时间误差大概是在20毫秒左右, 还不够吗? Windows是分时系统你想再精确也不可能让线程调度的精度小于系统调度的时间片。 window系统的运行的时间片大概是20毫秒左右,因此你想让定时器醒来的时间与目标时间小于1毫秒,这个不可能,除非你调整Window的时间片长度。如果你真要高精度的,你应该用实时系统,而不是分时系统。