thread.sleep(32)实际是thread.sleep(47)想实现thread.sleep(40)怎么办?

时间:2021-03-21 20:57:13
using System.data;
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很难把握的。

#2


thread.sleep(32); 
停止32毫秒有什么意义吗?试试把 32改成1000准确不准确

#3


这问题...CPU不一定在忙什么呢.. 帮顶把.

#4


thread.sleep(0); 

#5


有误差应该是正常的,因为执行
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


引用 5 楼 LemIST 的回复:
有误差应该是正常的,因为执行 
onsole.writeline(DateTime.now.millonsecond); 
也是需要时间的。 
这在物理上有个术语叫做“测不准原理” 
 up

#16


要想准确,应该把计时的部分跟执行的部分分开到两条线程上,不然计时也占用时间的啊

#17


 要求到毫秒级了,帮顶.

#18


另起1线程
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晶振自己计算...翻翻以前的精华帖吧,记得有一个讨论过...

#20


经过半个月的总结得出结论,window的计时最小是以15ms做为单位的,以15ms递增的,所以可以有15,30,45,15倍数的精度,而且是在上下浮动,设为30可能是15,可能是45(主要看cpu忙不忙)。而其他精度都是可忘不可及的。这点多任务的高级cpu没有单片机好,但是时间上好像有个叫tick的属性,是一个好几位的数,不知道这个通过控制这个来控制精度。

#1


1000是一秒
40很难把握的。

#2


thread.sleep(32); 
停止32毫秒有什么意义吗?试试把 32改成1000准确不准确

#3


这问题...CPU不一定在忙什么呢.. 帮顶把.

#4


thread.sleep(0); 

#5


有误差应该是正常的,因为执行
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


引用 5 楼 LemIST 的回复:
有误差应该是正常的,因为执行 
onsole.writeline(DateTime.now.millonsecond); 
也是需要时间的。 
这在物理上有个术语叫做“测不准原理” 
 up

#16


要想准确,应该把计时的部分跟执行的部分分开到两条线程上,不然计时也占用时间的啊

#17


 要求到毫秒级了,帮顶.

#18


另起1线程
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晶振自己计算...翻翻以前的精华帖吧,记得有一个讨论过...

#20


经过半个月的总结得出结论,window的计时最小是以15ms做为单位的,以15ms递增的,所以可以有15,30,45,15倍数的精度,而且是在上下浮动,设为30可能是15,可能是45(主要看cpu忙不忙)。而其他精度都是可忘不可及的。这点多任务的高级cpu没有单片机好,但是时间上好像有个叫tick的属性,是一个好几位的数,不知道这个通过控制这个来控制精度。

#21