4

我有一个基于文档视图框架的 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() 中的所有代码执行完毕后到达那里,还是更早到达那里?

4

2 回答 2

7

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

于 2014-08-25T21:25:54.907 回答
2

UpdateAllViews 是一个阻塞函数,它简单地循环每个视图并调用它们的 OnUpdate 函数。它不是“稍后排队”,并且像 PostMessage 一样立即返回调用。

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

于 2015-01-24T02:28:27.590 回答