>백엔드 개발 >C++ >C#에서 고해상도 타이머를 만드는 방법은 무엇입니까?

C#에서 고해상도 타이머를 만드는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-17 10:47:10364검색

How to Create a High-Resolution Timer in C#?

C의 고해상도 타이머

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(&quot;value&quot;);

            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(&quot;value&quot;);

            resolution = value;
        }
    }

    public bool IsRunning
    {
        get { return timerId != 0; }
    }

    public void Start()
    {
        CheckDisposed();

        if (IsRunning)
            throw new InvalidOperationException(&quot;Timer is already running&quot;);

        // 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(&quot;Timer has not been started&quot;);

        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(&quot;MultimediaTimer&quot;);
    }

    private void Dispose(bool disposing)
    {
        if (disposed)
            return;
        
        disposed = true;
        if (IsRunning)
        {
            StopInternal();
        }
        

위 내용은 C#에서 고해상도 타이머를 만드는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.