Heim >Backend-Entwicklung >C++ >Wie kann ich den aufgerufenen Code in der GUI -Event -Handhabung vereinfachen?

Wie kann ich den aufgerufenen Code in der GUI -Event -Handhabung vereinfachen?

Barbara Streisand
Barbara StreisandOriginal
2025-01-30 23:01:121019Durchsuche

How Can I Simplify InvokeRequired Code in GUI Event Handling?

vereinfachte automatische Verarbeitungsverarbeitung incokeRequired Code -Modus

Der herkömmliche Codemodus für den aufgerufenen Code ist kompliziert und frustrierend in der GUI -Ereignisverarbeitung. Dieser Modus muss prüfen, ob der aktuelle Thread auf das Handle des Steuerelements zugreifen kann.

Um dieses Problem zu lösen, haben wir die Methode von Lee verbessert und eine vereinfachte Methode entwickelt:

Diese Methode hat die Kontrollklasse erweitert.
<code class="language-csharp">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();
    }
}</code>

Für die Situation, die zurückgegeben werden muss, können Sie diese Ersatzimplementierung verwenden:

<code class="language-csharp">richEditControl1.InvokeIfRequired(() =>
{
    // 操作控件
    richEditControl1.RtfText = value;
    RtfHelpers.AddMissingStyles(richEditControl1);
});</code>

Zusätzlich zur Steuerung kann die Isynchronikinvoke -Schnittstelle auch von dieser Methode profitieren:

<code class="language-csharp">private static T InvokeIfRequiredReturn<T>(this Control control, Func<T> function)
{
    if (control.InvokeRequired)
    {
        return (T)control.Invoke(function);
    }
    else
    {
        return function();
    }
}</code>

Es ist erwähnenswert, dass IsynchronizeInvoke ein Objektarray als Parameterliste der Invoke -Methode benötigt. Wenn es jedoch keine Parameter gibt, können Sie NULL übergeben, wie im Dokument beschrieben.

<code class="language-csharp">public static void InvokeIfRequired(this ISynchronizeInvoke obj, MethodInvoker action)
{
    if (obj.InvokeRequired)
    {
        obj.Invoke(action, null);
    }
    else
    {
        action();
    }
}</code>
wir geben zu, dass die Kontrolle, wenn sie anfänglich sichtbar ist, manchmal auf einen Fehlalarm stoßen kann. Um dieses Problem zu lösen, haben wir ein 50 -Millisekunden -Schlafintervall in sichtbarer Untersuchung hinzugefügt. Obwohl diese Methode normalerweise gültig ist, kann ihre Wirksamkeit von den spezifischen Anwendungsfällen und den Zeitanforderungen in Ihrer Anwendung abhängen.

Das obige ist der detaillierte Inhalt vonWie kann ich den aufgerufenen Code in der GUI -Event -Handhabung vereinfachen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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