Как использовать Control-> Invoke ()? - PullRequest
0 голосов
/ 01 декабря 2011

Я не уверен в правильном использовании Control-> Invoke () с .NET, C ++ и Windows Forms.

Например, с помощью такого метода:

System::Void UI::setStatusText(System::String^ text) {
    if (this->InvokeRequired) {
        SetTextDelegate^ d = gcnew SetTextDelegate(this, &UI::setStatusText);
        statusLabel->Invoke(d, gcnew array<Object^> { text }); // <-- System.ExecutionEngineException
    } else
        statusLabel->Text = text;
}

Это правильно ?? Этот метод выполняется произвольным потоком и должен изменить текст statusLabel.

Делегат объявлен как:

delegate void SetTextDelegate(System::String^ text);

Но довольно часто я получаю исключение System.ExecutionEngineException в отмеченной строке.

Что не так с этим кодом?

Спасибо, Martin

edit: visual studio сообщает, что в mscorlib.dll есть неуправляемое исключение типа System.ExecutionEngineException, и зеленая стрелка отладки указывает на отмеченную строку. Это трассировка стека: http://sharetext.org/B8RR. Но как я могу получить внутреннее исключение? Или, если это не вызвано этими строками кода, что еще я могу сделать, чтобы выяснить ошибку?

1 Ответ

0 голосов
/ 12 января 2015

Код делегата кажется правильным.Но я не понимаю, что ты делаешь.Вы создаете делегат, который создает ту же функцию setStatusText !!Я думаю, что вы пытаетесь сделать что-то вроде этого:

delegate void SetTextDelegate();

System::Void UI::setStatusText(System::String^ text)
{
  statusLabel->Text = text
}

System::Void UI::ANOTHER_FUNCTION(System::String^ text)
{   
   SetTextDelegate^ d = gcnew SetTextDelegate(this, &UI::setStatusText);
   statusLabel->Invoke(d, gcnew array<Object^> { text });
}
...