C#에서는 System.Timer 클래스를 사용하여 지정된 간격으로 이벤트를 발생시키는 타이머를 만들 수 있습니다. 그러나 System.Timer 클래스는 해상도가 제한되어 있어 고해상도 타이밍이 필요한 애플리케이션에는 적합하지 않을 수 있습니다.
특정 간격으로 이벤트를 발생시키는 고해상도 타이머를 생성하려면 다음을 사용할 수 있습니다. 멀티미디어 타이머 API. 멀티미디어 타이머 API는 1밀리초만큼 작은 간격으로 이벤트를 발생시키는 데 사용할 수 있는 고해상도 타이머를 제공하는 Windows API입니다.
멀티미디어 타이머 API를 사용하여 고해상도 타이머를 생성하려면 다음 코드를 사용할 수 있습니다:
using System.Runtime.InteropServices; public class HighResolutionTimer { private bool disposed = false; private int interval, resolution; private UInt32 timerId; // Hold the timer callback to prevent garbage collection. private readonly MultimediaTimerCallback Callback; public HighResolutionTimer() { Callback = new MultimediaTimerCallback(TimerCallbackMethod); Resolution = 5; Interval = 10; } ~HighResolutionTimer() { Dispose(false); } public int Interval { get { return interval; } set { CheckDisposed(); if (value < 0) throw new ArgumentOutOfRangeException("value"); interval = value; if (Resolution > Interval) Resolution = value; } } // Note minimum resolution is 0, meaning highest possible resolution. public int Resolution { get { return resolution; } set { CheckDisposed(); if (value < 0) throw new ArgumentOutOfRangeException("value"); resolution = value; } } public bool IsRunning { get { return timerId != 0; } } public void Start() { CheckDisposed(); if (IsRunning) throw new InvalidOperationException("Timer is already running"); // Event type = 0, one off event // Event type = 1, periodic event UInt32 userCtx = 0; timerId = NativeMethods.TimeSetEvent((uint)Interval, (uint)Resolution, Callback, ref userCtx, 1); if (timerId == 0) { int error = Marshal.GetLastWin32Error(); throw new Win32Exception(error); } } public void Stop() { CheckDisposed(); if (!IsRunning) throw new InvalidOperationException("Timer has not been started"); StopInternal(); } private void StopInternal() { NativeMethods.TimeKillEvent(timerId); timerId = 0; } public event EventHandler Elapsed; public void Dispose() { Dispose(true); } private void TimerCallbackMethod(uint id, uint msg, ref uint userCtx, uint rsv1, uint rsv2) { var handler = Elapsed; if (handler != null) { handler(this, EventArgs.Empty); } } private void CheckDisposed() { if (disposed) throw new ObjectDisposedException("MultimediaTimer"); } private void Dispose(bool disposing) { if (disposed) return; disposed = true; if (IsRunning) { StopInternal(); }
위 내용은 C#에서 고해상도 타이머를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!