C++ 在使用MFC时,如何确保OnPaint在修改数据之前已返回?

C++ 在使用MFC时,如何确保OnPaint在修改数据之前已返回?,c++,concurrency,mfc,C++,Concurrency,Mfc,以下代码采用MFC文档视图体系结构。 doc_data是文档的CString数据成员。 问题是调用UpdateAllViews会导致显示doc_数据,但显示的字符串直到调用UpdateAllViews之后才被分配。可以通过取消消息框行的注释以强制等待片刻来防止这种行为 // CMainFrame message handlers void CMainFrame::OnViewTest() { CView* vwd = (GetActiveView()); CMFCApplica

以下代码采用MFC文档视图体系结构。 doc_data是文档的CString数据成员。 问题是调用UpdateAllViews会导致显示doc_数据,但显示的字符串直到调用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";
    }
}
//CMainFrame消息处理程序
void CMainFrame::OnViewTest()
{
CView*vwd=(GetActiveView());
CMFCApplicationxxDoc*pDoc{};
如果(vwd)
pDoc=dynamic_cast(vwd->GetDocument());
如果(pDoc){
pDoc->doc_data=“新数据”;
pDoc->UpdateAllView(空);
//AfxMessageBox(_T(“稍等”);
pDoc->doc_data=“甚至更新的数据”;
}
}
前面已经解释过:“OnUpdate函数通常会使视图无效,这将在以后导致OnDraw。UpdateAllViews在无效之后和绘制之前返回”


这可能会引起问题。例如,如果数据显示在图形中,则某些值可能会更新,而某些值不会更新。因此,我的问题是:在程序继续修改之前,有什么好方法可以确保(无需用户输入)正确显示所有当前数据?

您是在单个线程上运行的。一切都是按顺序执行的。你问的是一个不存在的问题。@i不可检测的问题在某种程度上确实存在。显然,
updatealViews
实际上并没有在那里更新视图-它只是使视图无效,将
WM_PAINT
放入消息队列中。一旦调用堆栈展开到消息泵,实际绘图将在
updatealViews
返回后进行。到那时,
doc\u data
被设置为
“甚至更新的数据”
,但OP显然希望呈现
“新数据”
。为什么您希望视图呈现文档中当前、最新数据以外的内容?我提交的解决方案是,在您实际准备好呈现所述数据之前,不要使用新数据更新
doc\u数据。您的问题源于试图违背文档/视图模型的粒度。假设程序正在运行一些耗时的函数,其中包含大量数据,例如天气预报模型。每隔一段时间,它就会调用UpdateAllView以显示更新的地图。它将继续计算,在地图实际显示时,一些计算变量已更改,而其他变量未更改。例如,风速可能来自上一个计算周期,而温度则基于最近的计算。为数据准备一个变量,为正在构建的数据准备一个单独的变量。新帧准备好后,交换这两个帧并发出
updatealView