c ++,mfc - 消息框显示,主窗口有一个取消按钮.在消息框处于活动状态时阻止取消

Ani*_*amy 1 c++ windows mfc messagebox

我有一个奇怪的问题.请考虑以下情形:

  • 主窗口在单击某个按钮时创建子对话框.
  • 子对话框在工作线程中执行一些任务.
  • 在该任务期间发生错误,导致显示消息框,说出"Yikes!Something failed wrong"的内容.
  • 单击子对话框的"取消"按钮,导致关闭子对话框.
  • 消息框仍然有效!单击消息框中的任何内容=崩溃.

关于事情如何发生的伪代码:(请在这里忽略语法正确性)

MainWindowClass mainObj;

void MainWindowClass::OnSomeButtonClick()
{
    SomeDialogClass someDialogObj;
    someDialogObj.DoModal();
}

int MainWindowClass::doTask()
{
    // Do work
    if(ERROR)
    {
        MessageBox("Yikes! Something went wrong.", "Error", MB_OK);
        return ERROR;
    }
} 

///////////////////////////////////////////////////////////////////
// Meanwhile, in another file,

extern MainWindowClass mainObj;

void SomeDialogClass::OnCancel()
{
    // Do all cleanup and close dialog
}

int SomeDialogClass::workerThreadFunc()
{
    return mainObj.doTask();
}

int SomeDialogClass::DoModal()
{
    AfxBeginThread(workerThreadFunc);
    // Do all other work and then wait for the worker thread
}
Run Code Online (Sandbox Code Playgroud)

我的问题是双重的:

  1. 取消时,有没有办法知道同一个应用程序中的任何消息框/对话框是否有效?
  2. 我的整个设计是错的,我应该完全做其他事情吗?

我认为使用模态对话框的一个主要原因是它能够防止焦点转到父对话框.然而,当显示该错误消息框时,我可以愉快地单击该对话框,然后单击"取消"并假装错误消息框从未显示.

Sma*_*acL 5

它应该将错误情况发送回UI线程,而不是让您的工作线程调出一个模态消息框.我对MFC和多线程的体验是,在同一个线程中处理所有UI会使事情变得更简单,并消除这些类型的错误.有两个线程可能同时提出模态对话框是一个麻烦.