Maison > développement back-end > C++ > Comment puis-je créer une minuterie haute résolution avec une signalisation d'intervalle basée sur des événements en C# ?

Comment puis-je créer une minuterie haute résolution avec une signalisation d'intervalle basée sur des événements en C# ?

Susan Sarandon
Libérer: 2025-01-17 10:51:10
original
550 Les gens l'ont consulté

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

Création d'une minuterie haute résolution précise avec gestion des événements en C#

Cet article détaille la création d'un minuteur haute résolution en C# qui déclenche un événement à des intervalles spécifiés, offrant un contrôle plus fin que la classe System.Timer standard. Nous explorerons les limites des options .NET existantes et présenterons une solution utilisant l'API Windows Multimedia Timer.

Bien que la classe Stopwatch fournisse une mesure du temps haute résolution, elle n'est pas conçue pour déclencher des événements à des intervalles précis. Le framework .NET lui-même n’a pas d’équivalent direct à nos besoins. Par conséquent, nous exploiterons l’API Windows Multimedia Timer, qui est optimisée pour la synchronisation des événements.

Implémentation d'une minuterie haute résolution à l'aide de l'API Multimedia Timer

Vous trouverez ci-dessous une implémentation C# utilisant l'API Multimedia Timer :

<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>
Copier après la connexion

Considérations importantes :

L'API Multimedia Timer interagit avec les paramètres à l'échelle du système ; des ajustements pourraient affecter les performances du système. Surveillez la fréquence de la minuterie pour vous assurer qu’elle correspond à l’intervalle cible. N'oubliez pas que Windows n'est pas un système d'exploitation en temps réel, la charge du système peut donc avoir un impact sur la précision du minuteur.

Conclusion

L'API Multimedia Timer fournit un mécanisme puissant pour créer des minuteries haute résolution avec une signalisation basée sur les événements en C#, répondant aux scénarios dans lesquels un timing précis est essentiel. Bien qu'il ne s'agisse pas d'une fonctionnalité native de .NET, ses capacités en font un outil précieux pour des exigences de synchronisation spécifiques.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal