Heim > Backend-Entwicklung > C++ > Wie kann ich in C# einen hochauflösenden Timer mit ereignisbasierter Intervallsignalisierung erstellen?

Wie kann ich in C# einen hochauflösenden Timer mit ereignisbasierter Intervallsignalisierung erstellen?

Susan Sarandon
Freigeben: 2025-01-17 10:51:10
Original
548 Leute haben es durchsucht

How Can I Create a High-Resolution Timer with Event-Based Interval Signaling in C#?

Erstellen eines präzisen hochauflösenden Timers mit Ereignisbehandlung in C#

Dieser Artikel beschreibt die Erstellung eines hochauflösenden Timers in C#, der in bestimmten Intervallen ein Ereignis auslöst und eine feinere Kontrolle als die Standardklasse System.Timer bietet. Wir untersuchen die Einschränkungen bestehender .NET-Optionen und präsentieren eine Lösung mithilfe der Windows Multimedia Timer API.

Während die Stopwatch-Klasse eine hochauflösende Zeitmessung bietet, ist sie nicht für die Ereignisauslösung in präzisen Intervallen konzipiert. Dem .NET-Framework selbst fehlt ein direktes Äquivalent zu unseren Anforderungen. Daher nutzen wir die Windows-Multimedia-Timer-API, die für das Ereignis-Timing optimiert ist.

Implementierung eines hochauflösenden Timers mithilfe der Multimedia-Timer-API

Unten ist eine C#-Implementierung unter Verwendung der Multimedia-Timer-API:

<code class="language-csharp">using System;
using System.Runtime.InteropServices;

class MultimediaTimer : IDisposable
{
    private bool disposed = false;
    private int interval, resolution;
    private uint timerId;
    private readonly MultimediaTimerCallback Callback;

    public delegate void MultimediaTimerCallback(uint uTimerID, uint uMsg, IntPtr dwUser, uint dw1, uint dw2);
    public event EventHandler<EventArgs> TimerElapsed;

    public MultimediaTimer()
    {
        Callback = new MultimediaTimerCallback(TimerCallbackMethod);
        Resolution = 5; // Default resolution (milliseconds)
        Interval = 10; // Default interval (milliseconds)
    }

    ~MultimediaTimer() { Dispose(false); }

    public int Interval
    {
        get { return interval; }
        set
        {
            CheckDisposed();
            if (value > 0) interval = value;
        }
    }

    public int Resolution
    {
        get { return resolution; }
        set
        {
            CheckDisposed();
            if (value > 0 && value <= interval) resolution = value;
        }
    }

    public void Start()
    {
        CheckDisposed();
        uint result = timeSetEvent((uint)interval, (uint)resolution, Callback, IntPtr.Zero, 1);
        if (result == 0) throw new Exception("Failed to start timer.");
        timerId = result;
    }

    public void Stop()
    {
        CheckDisposed();
        if (timerId != 0) timeKillEvent(timerId);
        timerId = 0;
    }


    private void TimerCallbackMethod(uint uTimerID, uint uMsg, IntPtr dwUser, uint dw1, uint dw2)
    {
        TimerElapsed?.Invoke(this, EventArgs.Empty);
    }

    private void CheckDisposed()
    {
        if (disposed) throw new ObjectDisposedException("MultimediaTimer");
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            Stop();
            disposed = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }


    [DllImport("winmm.dll")]
    private static extern uint timeSetEvent(uint uDelay, uint uResolution, MultimediaTimerCallback lpTimeProc, IntPtr dwUser, uint fuEvent);

    [DllImport("winmm.dll")]
    private static extern uint timeKillEvent(uint uTimerID);
}</code>
Nach dem Login kopieren

Wichtige Überlegungen:

Die Multimedia-Timer-API interagiert mit systemweiten Einstellungen; Anpassungen könnten sich auf die Systemleistung auswirken. Überwachen Sie die Timerfrequenz, um sicherzustellen, dass sie dem Zielintervall entspricht. Denken Sie daran, dass Windows kein Echtzeitbetriebssystem ist, daher kann die Systemlast die Timer-Genauigkeit beeinträchtigen.

Fazit

Die Multimedia-Timer-API bietet einen leistungsstarken Mechanismus zum Erstellen hochauflösender Timer mit ereignisbasierter Signalisierung in C# und adressiert Szenarien, in denen präzises Timing von entscheidender Bedeutung ist. Obwohl es sich nicht um eine native .NET-Funktion handelt, ist es aufgrund seiner Fähigkeiten ein wertvolles Werkzeug für spezifische Timing-Anforderungen.

Das obige ist der detaillierte Inhalt vonWie kann ich in C# einen hochauflösenden Timer mit ereignisbasierter Intervallsignalisierung erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage