是MFC UpdateAllViews阻塞还是非阻塞

Is MFC UpdateAllViews blocking or non blocking?

本文关键字:是非 MFC UpdateAllViews      更新时间:2023-10-16

我有一个基于文档视图框架的MFC代码。我使用Document类中的UpdateAllViews(nullptr,0,nullptr)来调用View的OnDraw成员函数。

void MyDocumentClass::MyFunction()
{
    //.. Document code to create and process data
    UpdateAllViews(nullptr,0,nullptr) // Invokes OnDraw
    // When does program control reach this line? 
}

我的问题是,请告诉我UpdateAllViews函数是阻塞的还是非阻塞的,程序控制何时到达UpdateAllView()旁边的行?它是在OnDraw()中的所有代码执行完毕后到达那里,还是更快到达那里?

UpdateAllViews是一个非阻塞函数,它只调用每个视图的OnUpdate。OnUpdate函数通常会使视图无效,这将在以后导致OnDraw。UpdateAllViews在无效之后和绘制之前返回。

UpdateAllViews是一个阻塞函数,它只需循环每个视图并调用它们的OnUpdate函数。它不是像PostMessage那样"稍后排队"并立即返回调用。

与SendMessage一样,UpdateAllViews在每个视图的OnUpdate函数中的所有代码都执行完毕后才会返回。这就是为什么在UpdateAllViews/OnUpdate中直接调用OnDraw或阻止I/O之类的繁重工作通常是个坏主意。更好的做法是基于提示参数使部分或全部视图无效,并让框架在下一个WM_PAINT上调用OnDraw。