我有一个WinForm的方法,该方法可以由创建WinForm的线程以外的线程调用。调试时,我到达调用this->Invoke();
的行,调试器似乎跳过了该行并继续正常执行。但是正常执行会导致程序循环并不断到达Invoke
调用,但永远不会返回。
我在Visual Studio 2013和2017中都遇到过这种情况。
//GUI.h
delegate void Whatever(System::String ^ text);
void SetConsoleTextBoxText(System::String^ input)
{
if (this->consoleTextBox->InvokeRequired)
{
Whatever^ we = gcnew Whatever(this, &GUI::SetConsoleTextBoxText);
this->Invoke(we, gcnew array<Object^> { input }); //debugger hits this and breaks
}
else
{
this->consoleTextBox->Text = input;
this->consoleTextBox->Refresh();
}
}
ref struct Globals {
static GUI ^ gui; //this is my "Global WinForm"
};
//Different .cpp file
//Running on a different thread than the WinForm "GUI" was made on
MethodThatIsCalledALotInALoop()
{
System::String^ sysStr = "some string";
GUI_Example_Receive::Globals::gui->SetConsoleTextBoxText(sysStr);
}
一段时间以来,我一直在尝试解决更新ConsoleTextBox
的问题,并且在调试该问题时遇到了困难。
我的语法错误吗?
我的调试程序是否设置为忽略第一个错误?
为什么调试器会执行/跳过一行然后继续运行程序而又没有再次遇到错误?
谢谢。
答案 0 :(得分:0)
我仍然不知道为什么调试器在该Invoke
调用中“中断”。
但是,我已经解决了导致Invoke
出现问题的线程问题,因此我不再面临这个问题。
单击开始thread
后,我在GUI.h
文件中创建了button
,而不是稍后在可以在GUI.cpp
文件中创建线程的程序中创建了Button_Click
要尝试更加具体,我的GUI.h
方法(在GUI.h
中)调用了在GUI.cpp
中声明并在{{1 }}。我最初是在GUI.cpp函数中创建线程的。 现在,我在Button_Click
的{{1}}方法中创建线程,并让该线程在GUI.h
中调用该方法。 GUI.cpp
中的方法调用GUI.cpp
的方法。如果拥有线程以外的线程正在调用该方法,该方法现在可以SetTextBoxText
本身(在我看来,总是这样)。
那是我的解决办法。如果有人能解释为什么这会使线程更安全,那么我很想知道。