【问题标题】:How CWinThread::OnIdle is used?CWinThread::OnIdle 是如何使用的?
【发布时间】:2011-12-01 23:10:34
【问题描述】:

如您所知,可以在 MFC UI 线程中指定 OnIdle。有关详细信息,您可以阅读此参考http://msdn.microsoft.com/en-us/library/1sa2f19f.aspx。但我不确定如何在实践中使用它。

根据上面的参考,

“当线程的消息队列为空时,在默认消息循环中调用 OnIdle。使用您的覆盖来调用您自己的后台空闲处理程序任务。”

所以我可以理解,当UI线程不忙时,调用该方法。根据上面的文档,

“由于应用程序在 OnIdle 返回之前无法处理消息,因此请不要在此函数中执行冗长的任务。”

但是在空闲事件中可以完成哪些任务呢?一个例子就足够了。谢谢

更新:一个令人沮丧的事实是this old (1996) article by Russell Weisz, titled "First Aid for the Thread-Impaired: Using Multiple Threads with MFC." 对理解 CWinThread 非常有帮助。

UPDATE2:由于 Microsoft 删除了 MSJ 文章,this one 可能会有所帮助。

【问题讨论】:

    标签: c++ multithreading mfc


    【解决方案1】:

    MFC 使用其默认 OnIdle 处理来启用和禁用菜单项和工具栏按钮,您可以在 CWinApp::OnIdle 的文档中看到。当条件发生变化时,不必有明确的代码来启用或禁用这些项目,它只会在没有其他事情发生时自动发生。

    Windows 本身使用类似的策略来触发 WM_PAINT 消息 - 只有当消息队列中没有其他内容时才会生成这些消息。

    当您想要完成低优先级任务时,您可以使用此技术。

    【讨论】:

    • @Paul,请注意 CWinApp 派生自 CWinThread,因此 CWinApp::OnIdle 实际上是一个覆盖。附言不要担心 MFC 文档的时代,它已经存在很长时间了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 2011-06-27
    • 2016-01-26
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多