Maison > développement back-end > C++ > Comment puis-je simplifier le code invoqué dans la gestion des événements de GUI?

Comment puis-je simplifier le code invoqué dans la gestion des événements de GUI?

Barbara Streisand
Libérer: 2025-01-30 23:01:12
original
1047 Les gens l'ont consulté

How Can I Simplify InvokeRequired Code in GUI Event Handling?

Mode de code invoqué de traitement automatique simplifié

Le mode de code invoqué traditionnel est compliqué et frustrant dans le traitement des événements GUI. Ce mode doit vérifier si le thread actuel peut accéder à la poignée du contrôle.

Afin de résoudre ce problème, nous avons amélioré la méthode de LEE et développé une méthode simplifiée:

Cette méthode a élargi la classe de contrôle.
public static void InvokeIfRequired(this Control control, MethodInvoker action)
{
    // 检查可见性,如有必要则调用
    while (!control.Visible)
    {
        System.Threading.Thread.Sleep(50);
    }

    if (control.InvokeRequired)
    {
        control.Invoke(action);
    }
    else
    {
        action();
    }
}
Copier après la connexion

Pour la situation qui doit être retournée, vous pouvez utiliser cette implémentation de remplacement:

richEditControl1.InvokeIfRequired(() =>
{
    // 操作控件
    richEditControl1.RtfText = value;
    RtfHelpers.AddMissingStyles(richEditControl1);
});
Copier après la connexion

En plus du contrôle, l'interface isynchronizeinvoke peut également bénéficier de cette méthode:

private static T InvokeIfRequiredReturn<T>(this Control control, Func<T> function)
{
    if (control.InvokeRequired)
    {
        return (T)control.Invoke(function);
    }
    else
    {
        return function();
    }
}
Copier après la connexion

Il convient de noter qu'IsynchronizeInvoke a besoin d'un tableau d'objets comme liste de paramètres de la méthode invoquée. Cependant, s'il n'y a pas de paramètres, vous pouvez passer null, comme décrit dans le document.

public static void InvokeIfRequired(this ISynchronizeInvoke obj, MethodInvoker action)
{
    if (obj.InvokeRequired)
    {
        obj.Invoke(action, null);
    }
    else
    {
        action();
    }
}
Copier après la connexion
Nous admettons que lorsque le contrôle est initialement visible, il peut parfois rencontrer une fausse alarme. Pour résoudre ce problème, nous avons ajouté un intervalle de sommeil de 50 millisecondes à l'examen visible. Bien que cette méthode soit généralement valide, son efficacité peut dépendre des cas d'utilisation spécifiques et des exigences de temps dans votre application.

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!

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