【问题标题】:How do I use MethodInvoker in C++?如何在 C++ 中使用 MethodInvoker?
【发布时间】:2011-03-15 21:58:16
【问题描述】:

我有一个 C++/CLI 应用程序,它有一个后台线程。每隔一段时间,我希望它将结果发布到主 GUI。我读过elsewhere on SO,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);
    }

...给我:

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

我在这里错过了什么?

【问题讨论】:

    标签: .net user-interface c++-cli backgroundworker porting


    【解决方案1】:

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

    【讨论】:

    • 他调用的不是委托的BeginInvoke方法,而是表单的BeginInvoke方法。这正是正确的做法。
    • 另外,不支持匿名委托的原因是 lambdas 的语法正在标准化。我希望在 C++0x 标准被接受后发布的第一个 Visual C++ 版本添加对匿名委托的支持,使用 C++0x 语法用于 lambda 和闭包。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多