如何在C++中使用MethodInvoker?

Jon*_*age 3 .net user-interface porting c++-cli backgroundworker

我有一个C++/CLI应用程序,它有一个后台线程.我经常希望将结果发布到主GUI.我已经在其他地方读过,因为MethodInvoker可以为此工作,但我很难将语法从C#转换为C++:

    void UpdateProcessorTemperatures(array<float>^ temperatures)
    {
        MethodInvoker^ action = delegate
        {
            const int numOfTemps = temperatures->Length;
            if( numOfTemps > 0 ) { m_txtProcessor2Temperature->Text = temperatures[0]; } else { m_txtProcessor2Temperature->Text = "N/A"; }
            if( numOfTemps > 1 ) { m_txtProcessor2Temperature->Text = temperatures[1]; } else { m_txtProcessor2Temperature->Text = "N/A"; }
            if( numOfTemps > 2 ) { m_txtProcessor2Temperature->Text = temperatures[2]; } else { m_txtProcessor2Temperature->Text = "N/A"; }
            if( numOfTemps > 3 ) { m_txtProcessor2Temperature->Text = temperatures[3]; } else { m_txtProcessor2Temperature->Text = "N/A"; }
        }
        this->BeginInvoke(action);
    }
Run Code Online (Sandbox Code Playgroud)

...给我:

1>c:\projects\MyTemperatureReporter\Form1.h(217) : error C2065: 'delegate' : undeclared identifier
1>c:\projects\MyTemperatureReporter\Form1.h(217) : error C2143: syntax error : missing ';' before '{'
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

Han*_*ant 8

C++/CLI不支持匿名委托,这是一个独有的C#功能.您需要在类的单独方法中编写委托目标方法.您还需要声明委托类型,MethodInvoker无法完成工作.看起来像这样:

    delegate void UpdateTemperaturesDelegate(array<float>^ temperatures);

    void UpdateProcessorTemperatures(array<float>^ temperatures)
    {
        UpdateTemperaturesDelegate^ action = gcnew UpdateTemperaturesDelegate(this, &Form1::Worker);
        this->BeginInvoke(action, temperatures);
    }

    void Worker(array<float>^ temperatures) 
    {
        const int numOfTemps = temperatures->Length;
        // etc..
    }
Run Code Online (Sandbox Code Playgroud)