Как я могу использовать MethodInvoker в C ++? - PullRequest
2 голосов
/ 14 июля 2010

У меня есть приложение на C ++ / CLI, в котором есть фоновый поток. Время от времени я хотел бы, чтобы он публиковал результаты в основном графическом интерфейсе. Я читал в другом месте на 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 '{'

Что мне здесь не хватает?

1 Ответ

6 голосов
/ 14 июля 2010

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