如何使用 MethodInvoker 委托在 cli c++ 中同步对控件线程的调用

how to use the MethodInvoker delegate to synchronize a call to a control's thread in cli c++

本文关键字:同步 控件 线程 调用 c++ MethodInvoker 何使用 cli      更新时间:2023-10-16

我有一个c#但是代码,我需要它在cli/c++,但我总是得到这个错误

"错误2错误C2955: 'BaseLibCS::MethodInvoker':使用类泛型需要泛型参数列表"

"Error 4 Error C2664:"BaseLibCS: MethodInvoker:: MethodInvoker(系统::字符串^……Cli::array ^)':无法将参数1从'GetNotifications ^const '到'System::String ^'"

"Error 3 Error C2102: '&' required l-value"

"错误1错误C2872: 'MethodInvoker':歧义符号"

这是我的c#代码:
private void HandleFarmStateChanged(object sender, ValueChangedEventArgs<CFarm.FarmState> e)
        {
            if (control.InvokeRequired)
            {
                control.Invoke(new MethodInvoker(delegate
                {
                    HandleFarmStateChanged(sender, e);
                }));
                return;
            }
           //FarmStateStatusLabel.Text = e.NewValue.ToString();
            Console.WriteLine(e.NewValue.ToString());
            Console.WriteLine("       ");
        }
这是我的c++代码:
void GetNotifications::HandleFarmStateChanged(Object ^sender, ValueChangedEventArgs<CFarm::FarmState> ^e)
{
    if (control->InvokeRequired)
            {
                control->Invoke(gcnew MethodInvoker(this,&GetNotifications::HandleFarmStateChanged(sender, e)));
                //}));
                return;
            }
    Console::WriteLine(e->NewValue.ToString());
    Console::WriteLine("       ");
}

经过一天的研究,我发现了这个问题,这是因为c++/CLI不支持匿名委托,这是c#独有的功能。您需要在类的单独方法中编写委托目标方法。你还需要声明委托类型,MethodInvoker不能完成这项工作。

你想得太多了,祝你今天愉快