当前位置:编程学习 > C#/ASP.NET >>

关于两个定时器同步的问题,能不能合并成一个定时器


定时器1
这是第一个定时器要完成的工作。
根据表格中的时间字段进行触发。在0秒的时候把标志1,标志2,标志3,标志4,标志5这5个数据发送出去。然后依次在2.1秒
2.2秒,13.5秒,22秒,22.1秒,25秒,26.03秒进行触发。然后循环到0秒,2.1……进行触发。


定时器2
第二个定时器是固定时间触发的,是0.05秒触发一次。也是传送一个数据。


如果在理想情况下,由于第二个定时器是每0.05秒触发一次,那在 2.1秒,2.2秒,13.5秒,22秒,22.1秒,25秒的时候就会和定时器1同时触发。
但是由于程序的原因,出现了累计误差,程序运行时间久了,定时器1和定时器2不能很好同步与合拍。

所以我想合并这两个定时器为一个定时器。该怎么做?

--------------------编程问答-------------------- 如果数据又相互影响,就不要这样,改成一个timer,里面按逻辑顺序执行 --------------------编程问答-------------------- timer就可以了,只要间隔设置为符合你判断的最小时间单位,然后定义2个计时单位来做判断~~CPU的时间片段大约是16毫秒,这个我在C#测试过了,只要大于16毫秒,还是可以确保基本精确的. --------------------编程问答-------------------- timer就可以了,只要间隔设置为符合你判断的最小时间单位,然后定义2个计时单位来做判断~~CPU的时间片段大约是16毫秒,这个我在C#测试过了,只要大于16毫秒,还是可以确保基本精确的.  --------------------编程问答-------------------- 具体怎样吧定时器1合并入定时器2呢?

我希望定时器1作为标准,定时器2的时间服从定时器1.


if(下一时间字段的时间-当前时间字段的时间>0.05)   下一次间隔0.05秒触发,
//譬如刚开始的时候,当前时间字段1的时间为0,下一时间字段2的时间为2.1

else  if (标志)时间字段2的时间-时间字段1的时间=a,下一次间隔a秒触发。标志为假
  else  下一次触发的时间是0.05-a;标志为真

上面这个循环我觉得还有一个问题,就是这个表格中的时间字段中相邻两个的时间差必须大于0.05秒。 --------------------编程问答-------------------- 换成状态机模式不用if else --------------------编程问答-------------------- timer并不是那么“准确”
因为要考虑轮询的因素。 --------------------编程问答-------------------- timer的精度和CPU的占用率有关系,上述说侧过的人都没提到CPU占用率,哥哥建议这样精确的算法想要实现同步,那就自己写一个循环吧,然后把两个定时器做的事情合并成一件事情,也就是一个算法的事情 --------------------编程问答-------------------- 完全可以,timer的时间间隔调成50
然后在timer的事件时记录时间
如:
public class  Tick
{
private int tick;
public Tick()
{
tick=Environment.TickCount;
}
  public bool Test(float second)
  {
if( (Environment.TickCount-tick)> second){
tick=Environment.TickCount;
 return true;
}
 return false;
}
 Tick t1=new Tick(2.1);
 Tick t2=new Tick(2.2);
......

public void OnTimer()
{
   if(t1.Test())
{
...
}
   if(t2.Test())
{
...
}
.....
}
   
}
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,