用于节拍器的计时器类

本文关键字:计时器 节拍器 用于 | 更新日期: 2023-09-27 18:37:16

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

尝试了所有这些计时器,但没有一个足够准确供我使用(它们的分辨率不能低于 15 毫秒)。

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上拥有分辨率低于5ms的计时器的最佳方法是什么?

编辑

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

用于节拍器的计时器类

为此,您应该使用多媒体计时器。

多媒体定时

服务允许应用程序安排定时器事件 为硬件提供尽可能高的分辨率(或精度) 平台。这些多媒体定时器服务允许您安排定时器 事件分辨率高于其他定时服务。

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

有各种 C# 库可帮助使用这些库。

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

更新

正如@Guillaume评论中指出的那样,似乎StopWatch性能计数器的托管替代品。所以我想你应该使用它

<小时 />

如果你想要精度,我肯定会使用本机QueryPerformanceCounter,但是你链接的那个是用于.NET Compact Framework(coredll)...对于 Windows,您需要使用 kernel32 .

我有一个非常旧的(2003)计时器实现 C# 上的 QueryPerformanceCounter C# 在此链接上。它依赖于其他模块,但应该很容易删除(我认为唯一的依赖项是在 Initialize() 方法上记录异常,但我 13 年没有接触过该代码......它是在 .NET 1.0 上运行的 C# 1.0)。

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

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