MFC UpdateAllViews是阻止还是非阻塞?

时间:2014-08-25 20:03:09

标签: c++ multithreading c++11 mfc document-view

我有一个基于Document View框架的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函数是阻塞还是非阻塞,程序控制何时到达UpdateAllViews()旁边的行?在OnDraw()中的所有代码完成执行后,它是否到达那里,或者它是否会更早到达那里?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

UpdateAllViews是一个阻塞函数,它只是循环每个视图并调用它们的OnUpdate函数。它不是以后的队列"并立即返回,如PostMessage。

与SendMessage类似,在每个视图的OnUpdate函数中的所有代码都已执行之前,UpdateAllViews不会返回。这就是为什么做一些像在RedAllViews / OnUpdate中直接调用OnDraw或阻塞I / O这样的东西通常是个坏主意。最好根据提示参数使部分或全部视图无效,然后让框架在下一个WM_PAINT上调用OnDraw。