.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
答案 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毫秒)。