我有一种奇怪的问题。请考虑以下情形:
事情发生的伪代码:(请在此处忽略语法正确性)
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
}
我的问题有两个:
我认为使用模态对话框的一个主要原因是它能够防止焦点转到父对话框。然而,当显示该错误消息框时,我可以愉快地单击该对话框,然后单击“取消”并假装错误消息框从未显示。
答案 0 :(得分:5)
不是让你的工作线程调出模态消息框,而是应该将错误情况发送回UI线程。我对MFC和多线程的体验是,在同一个线程中处理所有UI会使事情变得更简单,并消除这些类型的错误。有两个线程可能同时提出模态对话框,这就是问题。
答案 1 :(得分:0)
我对此有点新意,但我的建议是,如果在发生错误时将孩子取消,然后在发送错误之前将其销毁。
据我所知,SomeDialogClass是模态的,然后父启动另一个模态对话框,即MessageBox。现在,如果SomeDialogClass是无模式的,那么消息框将显示在顶部,因为SomeDialogClass将是整个桌面的子节点,而MainWindowClass的唯一子节点将是MessageBox。
我的印象是模态只会阻止焦点转到模态对话框下面的内容,而不是在顶部或打开后启动的内容。我已经完成了一个模态对话框,从中启动了一个无模式,并且可以在屏幕上移动得很好。另外,我从无模式对话框创建了一个WM_MESSAGE回到模态,以宣布它何时完成,以便无模式完成。