从C#中的计时器获取准确的滴答
我正在尝试重建一个旧的节拍器应用程序,该应用程序最初是使用MFC在C ++中编写的,然后使用C#在.NET中编写的。我遇到的问题之一是使计时器足够准确地"打勾"。
例如,假设简单的BPM(每分钟心跳数)为120,则计时器应每0.5秒(或者500毫秒)滴答一次。但是,使用此值作为滴答的基础并不完全准确,因为.NET仅保证计时器不会在经过的时间之前滴答。
当前,要解决上面使用的相同的120 BPM示例,我将刻度设置为大约100毫秒,并且仅在每5个计时器刻度上播放一次咔嗒声。确实确实提高了准确性,但是感觉有点像骇客。
那么,获得准确刻度的最佳方法是什么?我知道可以使用的计时器比Visual Studio中可以使用的Windows窗体计时器要多,但是我并不真正熟悉它们。
解决方案
回答
.NET中有三个计时器类,称为"计时器"。听起来我们正在使用Windows Forms,但实际上我们可能会发现System.Threading.Timer类更有用,但要小心,因为它会调用池线程,因此我们不能直接从Windows窗体与窗体进行交互。打回来。
另一种方法可能是p /调用Win32多媒体计时器timeGetTime,timeSetPeriod等。
一个快速的Google发现了这一点,这可能对http://www.codeproject.com/KB/miscctrl/lescsmultimediatimer.aspx很有用
"多媒体"(计时器)是在这种情况下要搜索的流行语。
回答
C ++应用程序使用什么?我们可以始终使用相同的东西,也可以将C ++中的计时器代码包装到C ++ / CLI类中。
回答
当计时器"滴答"事件代码在下一个"滴答"发生时尚未完成执行时,计时器类可能会开始出现奇怪的行为。解决此问题的一种方法是在滴答事件开始时禁用计时器,然后在结束时重新启用计时器。
但是,此方法不适用于"滴答"代码的执行时间在滴答计时中不可接受的错误的情况下,因为在此期间计时器将被禁用(不计数)。
如果禁用计时器是一种选择,那么我们还可以通过创建一个单独的线程来执行,睡眠x毫秒,执行,睡眠等操作,以达到相同的效果。
回答
System.Windows.Forms.Timer的精度限制为55毫秒...