哪个计时器类用于节拍器?

时间:2016-03-04 10:21:05

标签: c# timer

.net框架有很多种方法可以使用计时器,但是对于节拍器我应该使用哪一个?

我尝试了所有这些计时器,但没有人足够准确我的使用(他们不能在15ms以下的分辨率)。

System.Windows.Forms.Timer
System.Web.UI.Timer
System.Diagnostics.Stopwatch   
System.Timers.Timer
System.Threading.Timer

对于我的节拍器课程,我需要Ticks可靠,恒定,无漂移。

我在MSDN上发现了这个实现:https://msdn.microsoft.com/en-us/library/aa964692(v=vs.85).aspx使用“coredll.dll”

另一种解决方案可以是实现这些本机方法:

[DllImport("winmm.dll", SetLastError = true, EntryPoint = "timeSetEvent")]
internal static extern UInt32 TimeSetEvent(UInt32 msDelay, UInt32 msResolution, MultimediaTimerCallback callback, ref UInt32 userCtx, UInt32 eventType);

[DllImport("winmm.dll", SetLastError = true, EntryPoint = "timeKillEvent")]
internal static extern void TimeKillEvent(UInt32 uTimerId);

在Windows上拥有分辨率低于5毫秒的计时器的最佳方法是什么?

编辑

我在.net(法语)中找到了关于计时器的这个非常有趣的链接: http://www.e-naxos.com/Blog/post/NET-et-ses-timers-Prise-de-tete-ou-reelle-utilite-.aspx

2 个答案:

答案 0 :(得分:4)

您应该使用Multimedia Timer来实现此目的。

  

多媒体计时器服务允许应用程序安排计时器事件   具有最高分辨率(或精度)的硬件   平台。这些多媒体计时器服务允许您安排计时器   比其他计时器服务更高分辨率的事件。

     

这些计时器服务对需要的应用程序很有用   高分辨率计时。例如,MIDI音序器需要一个   高分辨率计时器,因为它必须保持MIDI事件的节奏   在1毫秒的分辨率内。

有各种C#库可供帮助使用它们。

例如:http://www.codeproject.com/Articles/5501/The-Multimedia-Timer-for-the-NET-Framework

答案 1 :(得分:1)

更新

正如@Guillaume在评论中指出的那样,似乎StopWatch可以作为性能计数器的托管替代品。所以我猜你应该用那个

如果你想要精确,我肯定会使用原生的QueryPerformanceCounter,但你链接的是.NET Compact Framework(coredll)...对于Windows,你需要使用{ {1}}。

我在C#on this link上有一个{strong>非常古老的(2003)计时器实现kernel32。它依赖于其他模块,但应该很容易删除(我认为唯一的依赖是在QueryPerformanceCounter方法上记录异常,但我没有在13年内触及该代码......它是C#1.0在.NET 1.0上运行。)

请注意,这不会发出事件,您需要处理自己的循环并检查已用时间。

也就是说,5ms以下是一个非常低的精度,你不应该依赖任何东西(只要你的计算机正在做其他事情,甚至垃圾收集你自己的应用程序),它的工作精度为5毫秒。如果您的节拍器应用程序发出声音,除非它是Windows 10,您可能已经有超过5毫秒的延迟(Windows 10低延迟标准声音驱动程序堆栈整数数据为4.5毫秒,浮点数据为16毫秒)。