调试Invoke()调用会导致调试器停止工作

时间:2018-07-16 16:37:41

标签: c++ multithreading winforms visual-studio-2017 invoke

我有一个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的问题,并且在调试该问题时遇到了困难。

我的语法错误吗?

我的调试程序是否设置为忽略第一个错误?

为什么调试器会执行/跳过一行然后继续运行程序而又没有再次遇到错误?

谢谢。

1 个答案:

答案 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本身(在我看来,总是这样)。

那是我的解决办法。如果有人能解释为什么这会使线程更安全,那么我很想知道。