【问题标题】:Is MFC UpdateAllViews blocking or non blocking?MFC UpdateAllViews 是阻塞还是非阻塞?
【发布时间】:2014-10-19 01:14:38
【问题描述】:

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

【问题讨论】:

  • 我相信它会阻塞。追踪电话以确保,我认为其中没有太多内容。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这个问题现在有两个完全矛盾的答案,但他们都是对的。这一切都取决于您认为OnUpdate 的实现。如果您按照 Microsoft 的意图进行操作,它将立即返回而无需执行任何实际工作,因此不会阻止任何事情 - 但这完全取决于您。很容易做错并导致严重延误。
    • 我同意,如果 OnUpdate 是按照 Microsoft 的预期编写的,希望这是典型情况,那么 UpdateAllViews 应该做的工作很少,并且感觉就像 send(fd,&buf,bufsz,0)有空缓冲区。在非典型情况下,它不像 send(fd,&buf,bufsz,MSG_DONTWAIT) 或 promise/callback/queue 接口那样非阻塞。在没有遵循 OnUpdate 的最佳实践之后,用户不应期望 UpdateAllViews 像后者一样工作。
    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多