【发布时间】:2011-11-01 20:44:08
【问题描述】:
我需要一个函数在 +/- 1 毫秒内的精确时间运行。我尝试了以下方法,但最终执行之间的最短时间为 15 毫秒。
void Main()
{
System.Timers.Timer timer = new System.Timers.Timer(1); // executes every 15ms
timer.Elapsed += new System.Timers.ElapsedEventHandler(myFunction);
System.Timers.Timer timer2 = new System.Timers.Timer(5); // executes every 15ms
timer2.Elapsed += new System.Timers.ElapsedEventHandler(myFunction);
System.Timers.Timer timer2 = new System.Timers.Timer(20); // executes every 31ms
timer3.Elapsed += new System.Timers.ElapsedEventHandler(myFunction);
timer.Start();
timer2.Start();
timer3.Start();
}
void myFunction()
{
doWord();
}
使用 Thread.Sleep() 获得相同的结果。
申请概要。
我将读取一个包含 1553 条消息(每条都带有时间戳)的文件。我需要以文件包含的尽可能接近的时间重播这些消息。消息的时间戳以微秒为单位记录,但我只需要毫秒精度。
这是使用 DDC 1553 卡(PCI 卡)完成的。我有一个分析器,它允许我查看消息,包括消息之间的增量时间,以衡量我的准确性。
我使用的机器有一个带超线程的 QuadCore。使用 for(int i=0; .....) 我可以得到 0.5 毫秒的精度。然而,这是非常低效的,如果可能的话,宁愿使用更现实、更便携的方法。
【问题讨论】:
-
那是一个非常狭窄的时间窗口,你想每毫秒做什么?请记住,Timer 事件通常由 ThreadPool 引发,因此它们必须从池中获取线程并引发事件,这需要时间。
-
仅供参考:切勿将
Thread.Sleep用于时间敏感的任务。 IIRC,它保证线程将睡眠时间至少,但是它可以睡眠的最长时间是未定义的。有关更多信息,请参阅this 问题。抱歉,对于您的实际问题,我无法提供更多帮助。 -
定时器分辨率为 1/64 秒,15.625 毫秒。 Pinvoking timeBeginPeriod 和 timeSetEvent 可以获得一个 1 毫秒的计时器。不要假设您实际上会持续获得 1 毫秒。
-
@James:我正在使用 DDC 1553 卡进行 1553 异步消息传递。所以我需要能够在 1553 +/- 1 毫秒内发送这些消息。
标签: c# .net multithreading performance timer