我有一个基于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()中的所有代码完成执行后,它是否到达那里,或者它是否会更早到达那里?
答案 0 :(得分:6)
UpdateAllViews是一个非阻塞功能,它只调用每个视图的OnUpdate。 OnUpdate函数通常使视图无效,这将导致稍后的OnDraw。 UpdateAllViews在无效之后和绘画之前返回。
答案 1 :(得分:2)
UpdateAllViews是一个阻塞函数,它只是循环每个视图并调用它们的OnUpdate函数。它不是以后的队列"并立即返回,如PostMessage。
与SendMessage类似,在每个视图的OnUpdate函数中的所有代码都已执行之前,UpdateAllViews不会返回。这就是为什么做一些像在RedAllViews / OnUpdate中直接调用OnDraw或阻塞I / O这样的东西通常是个坏主意。最好根据提示参数使部分或全部视图无效,然后让框架在下一个WM_PAINT上调用OnDraw。