Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya dapat memudahkan kod InvokeRequired dalam pengendalian acara GUI?

Bagaimanakah saya dapat memudahkan kod InvokeRequired dalam pengendalian acara GUI?

Barbara Streisand
Barbara Streisandasal
2025-01-30 23:01:121019semak imbas

How Can I Simplify InvokeRequired Code in GUI Event Handling?

pemprosesan automatik yang dipermudahkan InvokeRequired Code Mode

Mod kod InvokeRequired tradisional adalah rumit dan mengecewakan dalam pemprosesan acara GUI. Mod ini perlu menyemak sama ada benang semasa boleh mengakses pemegang kawalan.

Untuk menyelesaikan masalah ini, kami meningkatkan kaedah Lee dan mengembangkan kaedah yang mudah:

Kaedah ini telah memperluaskan kelas kawalan.
<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>

Untuk situasi yang perlu dikembalikan, anda boleh menggunakan pelaksanaan penggantian ini:

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

Selain mengawal, antara muka isynchronizeinvoke juga boleh mendapat manfaat daripada kaedah ini:

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

Perlu diingat bahawa isynchronizeinvoke memerlukan pelbagai objek sebagai senarai parameter kaedah Invoke. Walau bagaimanapun, jika tiada parameter, anda boleh lulus null, seperti yang diterangkan dalam dokumen.

<code class="language-csharp">public static void InvokeIfRequired(this ISynchronizeInvoke obj, MethodInvoker action)
{
    if (obj.InvokeRequired)
    {
        obj.Invoke(action, null);
    }
    else
    {
        action();
    }
}</code>
Kami mengakui bahawa apabila kawalan pada mulanya dapat dilihat, ia kadang -kadang dapat menemui penggera palsu. Untuk menyelesaikan masalah ini, kami menambah selang tidur 50 milisaat dalam peperiksaan yang kelihatan. Walaupun kaedah ini biasanya sah, keberkesanannya mungkin bergantung kepada kes penggunaan tertentu dan keperluan masa dalam permohonan anda.

Atas ialah kandungan terperinci Bagaimanakah saya dapat memudahkan kod InvokeRequired dalam pengendalian acara GUI?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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