using System.threading;
using System.text;
class program{
static void main()
{int i=0;
while(true)
{i++;
thread.sleep(32);
console.writeline(DateTime.now.millonsecond);
if(i>=100)
{Console.readkey();}
}
}
}
输出的数之间差不是32而是47,31以前的还准确。99的时候是110.请问问题出在哪里,谁能给出一个精确的定时器,毫秒级的。我试了System.windows.timer,System.timer.timer;System.threading.timer;都不可以。不够精确,总有误差,难道是我的程序执行的时间太长,超过了定时的间隔吗?
20 个解决方案
#1
1000是一秒
40很难把握的。
40很难把握的。
#2
thread.sleep(32);
停止32毫秒有什么意义吗?试试把 32改成1000准确不准确
停止32毫秒有什么意义吗?试试把 32改成1000准确不准确
#3
这问题...CPU不一定在忙什么呢.. 帮顶把.
#4
thread.sleep(0);
#5
有误差应该是正常的,因为执行
onsole.writeline(DateTime.now.millonsecond);
也是需要时间的。
这在物理上有个术语叫做“测不准原理”
onsole.writeline(DateTime.now.millonsecond);
也是需要时间的。
这在物理上有个术语叫做“测不准原理”
#6
31想的通,但为什么会有46?
#7
47?
#8
休眠间隔从20到31,实际的都是31,31到47都是47.
#9
值比较小毫秒没多大意义,如果要处理毫秒级别的运算,请使用API。
#10
毫秒級想那麼精確可能性也太小了
#11
Thread休眠结束后不一定能够立即得到cpu的控制权?所以你的代码还是不能执行,也就打印不出32了。
#12
CPU有基本时间戳的 一般来说完成一个基本任务需要10mS,也就是精度最多到10ms 不可能再低了
#13
所以在高精度中Sleep(32)是无意义的
#14
用System.Timers 名称空间下的 Timer
#15
up
#16
要想准确,应该把计时的部分跟执行的部分分开到两条线程上,不然计时也占用时间的啊
#17
要求到毫秒级了,帮顶.
#18
另起1线程
int tmp=Environmnet.TickCont;
while(true)
{
tmp=Environmnet.TickCont-tmp;
if(tmp>37)
{
Envent();
break;
}
}
int tmp=Environmnet.TickCont;
while(true)
{
tmp=Environmnet.TickCont-tmp;
if(tmp>37)
{
Envent();
break;
}
}
#19
Windows系统时钟的精度是15-50毫秒,以前有几个帖子说过好几次了...就是说XP以上的系统在大约15毫秒内时间刻度是一样的...32毫秒实际上是32±15毫秒,你运气好所以是47毫秒...
需要更高精度用用CPU晶振自己计算...翻翻以前的精华帖吧,记得有一个讨论过...
需要更高精度用用CPU晶振自己计算...翻翻以前的精华帖吧,记得有一个讨论过...
#20
经过半个月的总结得出结论,window的计时最小是以15ms做为单位的,以15ms递增的,所以可以有15,30,45,15倍数的精度,而且是在上下浮动,设为30可能是15,可能是45(主要看cpu忙不忙)。而其他精度都是可忘不可及的。这点多任务的高级cpu没有单片机好,但是时间上好像有个叫tick的属性,是一个好几位的数,不知道这个通过控制这个来控制精度。
#21
#1
1000是一秒
40很难把握的。
40很难把握的。
#2
thread.sleep(32);
停止32毫秒有什么意义吗?试试把 32改成1000准确不准确
停止32毫秒有什么意义吗?试试把 32改成1000准确不准确
#3
这问题...CPU不一定在忙什么呢.. 帮顶把.
#4
thread.sleep(0);
#5
有误差应该是正常的,因为执行
onsole.writeline(DateTime.now.millonsecond);
也是需要时间的。
这在物理上有个术语叫做“测不准原理”
onsole.writeline(DateTime.now.millonsecond);
也是需要时间的。
这在物理上有个术语叫做“测不准原理”
#6
31想的通,但为什么会有46?
#7
47?
#8
休眠间隔从20到31,实际的都是31,31到47都是47.
#9
值比较小毫秒没多大意义,如果要处理毫秒级别的运算,请使用API。
#10
毫秒級想那麼精確可能性也太小了
#11
Thread休眠结束后不一定能够立即得到cpu的控制权?所以你的代码还是不能执行,也就打印不出32了。
#12
CPU有基本时间戳的 一般来说完成一个基本任务需要10mS,也就是精度最多到10ms 不可能再低了
#13
所以在高精度中Sleep(32)是无意义的
#14
用System.Timers 名称空间下的 Timer
#15
up
#16
要想准确,应该把计时的部分跟执行的部分分开到两条线程上,不然计时也占用时间的啊
#17
要求到毫秒级了,帮顶.
#18
另起1线程
int tmp=Environmnet.TickCont;
while(true)
{
tmp=Environmnet.TickCont-tmp;
if(tmp>37)
{
Envent();
break;
}
}
int tmp=Environmnet.TickCont;
while(true)
{
tmp=Environmnet.TickCont-tmp;
if(tmp>37)
{
Envent();
break;
}
}
#19
Windows系统时钟的精度是15-50毫秒,以前有几个帖子说过好几次了...就是说XP以上的系统在大约15毫秒内时间刻度是一样的...32毫秒实际上是32±15毫秒,你运气好所以是47毫秒...
需要更高精度用用CPU晶振自己计算...翻翻以前的精华帖吧,记得有一个讨论过...
需要更高精度用用CPU晶振自己计算...翻翻以前的精华帖吧,记得有一个讨论过...
#20
经过半个月的总结得出结论,window的计时最小是以15ms做为单位的,以15ms递增的,所以可以有15,30,45,15倍数的精度,而且是在上下浮动,设为30可能是15,可能是45(主要看cpu忙不忙)。而其他精度都是可忘不可及的。这点多任务的高级cpu没有单片机好,但是时间上好像有个叫tick的属性,是一个好几位的数,不知道这个通过控制这个来控制精度。