日期:2014-05-17  浏览次数:20922 次

关于精准计时的方法
大家好,我最近需要用C#写上位机软件。要求每隔500ms和每隔1000ms分别发送5个字节到串口.因为多线程接触得很少,所以觉得一头雾水,我尝试在一个线程中用死循环发送字节然后在循环末尾加Thread.Sleep(500);,线程优先级设置为Highest,但发现如果频繁移动窗口重绘或者什么别的原因导致CPU占用很高的话,发送的时间间隔变得越来越长。
  之后我又试了在死循环里每毫秒检查Enviroment.TickCount,如果相差500ms或以上就发送字节..虽然好了些,但经常移动窗口的话还是出现时间滞后。
最后只好弃多线程改用WinForm的Timer控件,这下基本没影响了。唯一不足是如果在窗口标题栏按右键不放,似乎UI线程完全停滞。。直到松开,计时器才能继续工作。
  所以想请教下各位高手,如何在非UI线程里做到比较准确地计时。十分感谢!

------解决方案--------------------
//假如Send()是你发送字节到串口的方法
void Send()
{
...
}
//创建一个线程
//声明一个线程的变量td ,并把td指向方法Send
Thread td = new Thread(new ThreadStart(Send));
//起动线程;
td.Start()

这样UI线程就不受影响了
------解决方案--------------------
应该用timer,用sleep的话时间长了会有累积误差。