首页 / 知识
关于.net:从C#中的计时器获取准确的滴答
2023-04-12 01:41:00

Getting accurate ticks from a timer in C#我正在尝试重建原来使用C ++中的MFC编写的旧节拍器应用程序,然后使用C#在.NET中编写。我遇到的问题之一是使计时器足够准确地"打勾"。 例如,假设简单的BPM(每分钟心跳数)为120,则计时器应每0.5秒(或500毫秒)滴答一次。但是,将其用作刻度的基础并不完全准确,因为.NET仅保证您的计时器不会在经过的时间之前滴答。 目前,为了解决上面使用的相同的120 BPM示例,我将刻度设置为大约100毫秒,并且仅在每5个计时器刻度上播放一次咔嗒声。确实确实提高了准确性,但是感觉有点像骇客。 那么,获得准确刻度的最佳方法是什么?我知道可以使用的计时器比Visual Studio中可以使用的Windows窗体计时器要多,但是我对它们并不真正熟悉。 .NET中有三个计时器类,称为"计时器"。听起来您正在使用Windows Forms,但实际上您可能会发现System.Threading.Timer类更有用-但要小心,因为它会调用池线程,因此您不能直接从回调。 另一种方法可能是p /调用Win32多媒体计时器-timeGetTime,timeSetPeriod等。 一个快速的Google发现了这一点,这可能很有用http://www.codeproject.com/KB/miscctrl/lescsmultimediatimer.aspx "多媒体"(计时器)是在这种情况下要搜索的流行语。
另一种可能是DispatcherTimer的WPF实现中存在错误 http://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/Threading/DispatcherTimer.cs,143
http://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/Threading/Dispatcher.cs
http://referencesource.microsoft.com/#WindowsBase/Shared/MS/Win32/SafeNativeMethodsCLR.cs,505
http://msdn.microsoft.com/en-us/library/windows/desktop/ms644906%28v=vs.85%29.aspx
开发最近的数据记录项目时遇到了这个问题。 .NET计时器(windows.forms,system.threading和system.timer)存在的问题是,它们只能精确到10毫秒左右,这是由于我相信.NET中内置的事件计划。 (我在这里谈论的是.NET 2)。这对我来说是不可接受的,因此我不得不使用多媒体计时器(您需要导入dll)。我还为所有计时器编写了包装器类,因此您可以根据需要使用最少的代码更改在它们之间进行切换。在这里查看我的博客文章: C ++应用程序使用什么?您可以始终使用相同的东西,也可以将计时器代码从C ++包装到C ++ / CLI类中。
当计时器"滴答"事件代码在下一个"滴答"发生时尚未完成执行时,计时器类可能会开始表现异常。解决此问题的一种方法是在滴答事件开始时禁用计时器,然后在结束时重新启用计时器。 但是,此方法不适用于"滴答"代码的执行时间在滴答计时中不可接受的错误的情况下,因为计时器将在这段时间内被禁用(不计数)。 如果禁用计时器是一种选择,那么您还可以通过创建一个单独的线程来执行,睡眠x毫秒,执行,睡眠等操作,从而达到相同的效果。 |
最新内容
相关内容
iPhone Web应用程序,模板,框架?
iPhone Web应用程序,模板,框架?,iPhone Web应用程序,模板,框架?,应用程序,站点,用于,网页,iPhone web applications, templates, framework关于体系结构:我应该如何构建Java应
关于体系结构:我应该如何构建Java应用程序,将类放在哪里?,关于体系结构:我应该如何构建Java应用程序,将类放在哪里?,应用程序,支持,困惑,在Web应用程序上执行压力测试?
在Web应用程序上执行压力测试?,在Web应用程序上执行压力测试?,应用程序,主页,写了,简单,Performing a Stress Test on Web Application关于用户界面:图标:没有设计技能的开
关于用户界面:图标:没有设计技能的开发人员如何使他/她的应用程序图标看起来漂亮?,关于用户界面:图标:没有设计技能的开发人员如何使他/我应该如何将文件加载到Java应用程
我应该如何将文件加载到Java应用程序中?,我应该如何将文件加载到Java应用程序中?,文件,应用程序,加载,文本,How should I load files i关于国际化:ASP.NET MVC应用程序中
关于国际化:ASP.NET MVC应用程序中的多种语言?,关于国际化:ASP.NET MVC应用程序中的多种语言?,应用程序,语言,接口,支持,Multiple langua关于身份验证:如何将SSL添加到使用h
关于身份验证:如何将SSL添加到使用httplistener的.net应用程序-它不会在IIS上运行,关于身份验证:如何将SSL添加到使用httplistener的使用MySQL代替SQLite创建一个新的R
使用MySQL代替SQLite创建一个新的Ruby on Rails应用程序,使用MySQL代替SQLite创建一个新的Ruby on Rails应用程序,应用程序,最新版关于Visual Studio:部署VB.NET应用
关于Visual Studio:部署VB.NET应用程序的最佳方法是什么?,关于Visual Studio:部署VB.NET应用程序的最佳方法是什么?,也有,我不,当我,但在C#WinForms应用程序中显示Flash内
在C#WinForms应用程序中显示Flash内容,在C#WinForms应用程序中显示Flash内容,方法,应用程序,用户控件,显示,Displaying Flash content关于C#:向.NET应用程序添加脚本功能
关于C#:向.NET应用程序添加脚本功能,关于C#:向.NET应用程序添加脚本功能,交易,数据库,小游戏,脚本,Adding scripting functionality to .Java库或应用程序将CSV转换为XML文
Java库或应用程序将CSV转换为XML文件?,Java库或应用程序将CSV转换为XML文件?,标签,数据文件,应用程序,文件,Java lib or app to conver