我有一个C ++ / CLI应用程序,它有一个后台线程。我经常希望将结果发布到主GUI。我已经阅读了MethodInvoker可以为此工作的elsewhere on SO,但我很难将语法从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 '{'
我在这里缺少什么?
答案 0 :(得分:6)
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..
}