我不确定使用.NET,C ++和Windows窗体正确使用Control-> Invoke()。
例如,使用这样的方法:
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。
这段代码出了什么问题?
谢谢, 马丁
edit:visual studio表示mscorlib.dll中存在类型System.ExecutionEngineException的非托管异常,绿色调试箭头指向标记的行。这是堆栈跟踪:http://sharetext.org/B8RR。但是我如何获得内部异常呢?或者,如果这不是由这些代码行引起的,我还能做些什么来找出错误?
答案 0 :(得分:0)
委托代码似乎是正确的。但我不明白你在做什么。您正在创建一个创建相同函数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 });
}