以下代码假定MFC文档视图体系结构。 doc_data是文档的CString数据成员。 问题是调用UpdateAllViews会导致显示doc_data,但是在调用UpdateAllViews之后才会分配显示的字符串。通过取消注释消息框行以强制片刻等待,可以防止此行为。
// CMainFrame message handlers
void CMainFrame::OnViewTest()
{
CView* vwd = (GetActiveView());
CMFCApplicationxxDoc* pDoc{};
if (vwd)
pDoc = dynamic_cast<CMFCApplicationxxDoc*>(vwd->GetDocument());
if (pDoc) {
pDoc->doc_data = "New data";
pDoc->UpdateAllViews(NULL);
//AfxMessageBox(_T("Wait a moment"));
pDoc->doc_data = "Even newer data";
}
}
之前已经解释过:“OnUpdate函数通常会使视图无效,以后会导致OnDraw.UpdateAllViews在无效之后和绘画之前返回”Is MFC UpdateAllViews blocking or non blocking?
这可能会导致问题。例如,如果数据显示在图表中,则某些值可能会更新,而某些值则不会更新。所以我的问题是:在程序继续修改之前,确保(没有用户输入)所有当前数据的正确方法是什么?