Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mencipta Pemasa Resolusi Tinggi dalam C#?

Bagaimana untuk Mencipta Pemasa Resolusi Tinggi dalam C#?

Susan Sarandon
Lepaskan: 2025-01-17 10:47:10
asal
361 orang telah melayarinya

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

Pemasa Resolusi Tinggi dalam C

Dalam C#, kelas System.Timer boleh digunakan untuk mencipta pemasa yang menaikkan acara pada selang waktu tertentu. Walau bagaimanapun, kelas System.Timer mempunyai resolusi terhad dan mungkin tidak sesuai untuk aplikasi yang memerlukan pemasaan resolusi tinggi.

Untuk mencipta pemasa resolusi tinggi yang menimbulkan acara pada selang waktu tertentu, anda boleh menggunakan API Pemasa Multimedia. API Pemasa Multimedia ialah API Windows yang menyediakan pemasa beresolusi tinggi yang boleh digunakan untuk menaikkan acara pada selang waktu sekecil 1 milisaat.

Untuk mencipta pemasa resolusi tinggi menggunakan API Pemasa Multimedia, anda boleh menggunakan kod berikut:

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();
        }
        
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Pemasa Resolusi Tinggi dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan