使用高分辨率间隔/计时器增强事件我想使用c#使用最高分辨率计时器。例如,我想每11个时钟引发一个事件(我听说tick是pc中的最高计数器)。我尝试了定时器,发现最小经过时间以毫秒为单位。我看了看秒表,但秒表没有触发事件。谢谢。使用多媒体计时器应该每秒为您提供大约1000个事件。这段代码应该可以帮助你。publicdelegatevoidTimerEventHandler(UInt32id,UInt32msg,refUInt32userCtx,UInt32rsv1,UInt32rsv2);//////具有毫秒精度的多媒体计时器//////每msDelay毫秒一个事件///计时器精度指示(较低的值更精确但资源不友好)///委托开始///callBack数据///一个事件或多个事件///不要忘记调用timeKillEvent!///失败时为0或任何其他值作为用于timeKillEvent的计时器ID处理程序,参考UInt32userCtx,UInt32事件类型);//////多媒体计时器停止函数//////timeSetEvent中的计时器ID///此函数停止计时器[DllImport("winmm.dll",SetLastError=true)]staticexternvoidtimeKillEvent(UInt32uTimerID);运行它们后,请停止这些计时器。它们对你的系统非常沉闷*。捕获所有异常,不要让它们逃脱您的事件处理程序。*启动超过5个计时器会严重降低大多数系统的速度!在事件处理程序中执行尽可能少的代码,并确保执行代码的速度不超过1毫秒,否则会遇到严重问题。我每10-50个刻度启动一次代表以增加标签显示。在Thread.Sleep上发生的正常线程切换将使一个线程槽中的代码为空,并且大约需要40毫秒。您还可以通过某些NT内核调用来增加线程切换频率,但请不要这样做。首先,您需要知道,由于硬件和软件的限制,在计算机上准确计时即使不是不可能,也是非常困难的。好消息是很少需要这种精度。十个滴答声是非常短的时间。在此间隔期间,CPU完成的工作很少,而且永远不会具有统计意义。作为参考,Windows时钟精确到大约10毫秒(在早期版本中精确度较低)。通过调用DateTime.UtcNow包装代码没有比这更好的了。在您的问题中,您谈到想要“举办活动”。问题在于,唯一一种以特定时间间隔引发事件的计时对象是Timer对象。它在.NETFramework中有3种不同的风格(System.Timers.Timer、System.Threading.Timer和System.Windows.Forms.Timer),所有这些都有自己独特的使用场景和相关的怪癖,但都不是它们保证精度并满足您的要求。它们甚至不是设计用于执行此操作的,WindowsAPI也没有公开任何可提供此类精度的等效函数。我之所以问您为什么要这样做,以及您是否要对其进行基准测试,是因为它改变了整个游戏。.NETFramework(自版本2.0起)提供了一个Stopwatch对象,该对象旨在精确测量在基准测试或分析等情况下经过的时间。秒表只是包装了WindowsAPI函数QueryPerformanceFrequency和QueryPerformanceCounter(它应该确认我对其预期用途的建议)。我们以前必须使用P/Invoke这些函数来访问早期版本的Framework中的此类功能,但现在可以方便地内置它。如果你需要一个分辨率相对较高的计时器来进行基准测试,Stopwatch是你最好的选择。从理论上讲,它可以为您提供亚微秒级的计时。但这并非没有问题。它不会引发任何事件,因此如果您当前的设计依赖于事件处理,您将不得不重新考虑它。此外,也不能保证完全准确。当然,考虑到硬件限制,它可能具有最高分辨率,但这并不意味着它一定是您指定的。在多处理器系统上可能不可靠,例如,启动和停止必须在同一处理器上执行。这应该无关紧要,但确实如此。对于可以调高和调低时钟速度的处理器,它也可能不可靠。我敢说调用QueryPerformanceCounter本身需要一些时间——大约5微秒,即使在现代2+GHz处理器上也是如此,这会阻止您实现理论上听起来不错的亚微秒计时。任何合理的代码分析器都会认为这段时间可以忽略不计,因为它确实如此。(另请参阅:http://www.devsource.com/c/a/Techniques/High-Performance-Timing-under-Windows/2/)各种计时器类使用更大的粒度。Threading.Timer和Timers.Timer都使用1/64秒,即15.625毫秒。如果您所指的“刻度”是DateTime类、TimeSpan类使用并由秒表输出的100纳秒刻度,那么您询问的11刻度长度是1,100纳秒,即1.1微秒。据我所知,没有内置计时器可以为您提供该解决方案。如果你真的希望事件每1.1微秒发生一次,你将不得不删除“计时器”的想法,而是考虑一个短暂的延迟。使线程具有高优先级并循环运行您的事件。不要调用Thread.Sleep()因为我认为1.1微秒小于系统调度程序的时间片。你需要做一个延迟循环。另外,要意识到你问的是非常非常小的时间间隔。在2GHz处理器上,1.1微秒仅是2,200个处理器周期。不是微不足道的数量,但不是很多时间来完成很多事情。如果您像您在评论中所说的那样谈论1个滴答声,那只有200个处理器周期:这足以进行数十次数学运算并可能调用一个函数。以上就是C#学习教程的全部内容:使用高分辨率间隔/定时器改进事件共享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
