【问题标题】:MFC: GUI freezes, but keeps workingMFC:GUI 冻结,但继续工作
【发布时间】:2018-06-28 15:51:51
【问题描述】:

我遇到了一个我无法解决的问题。

我正在 Visual Studio 中使用 MFC 开发一个项目。问题是,有时 GUI 只是停止明显的反应,但从技术上讲,它一直在做它打算做的功能。这意味着,当我按下按钮时,函数 OnBnXXXPressed 正在执行,但按钮看起来不像被按下,好像我按下的是按钮的图片,而不是按钮本身。而且不仅仅是这个按钮 - GUI 的所有其他元素 似乎都在继续工作,但并不表明它正在工作。

此外,在这种状态下,对话窗口不会在他们调用时显示。如果我调用AfxMessageBox,消息框不会出现,调用这个函数的线程不会被阻塞; AfxMessageBox 基本上会被跳过。

我完全不知道什么可能导致这种行为。问题是:程序中应该发生什么才能让它以这种方式运行?特别是如果它是用 MFC 构建的?

该项目由 50 多个文件组成,每个负责 GUI 的函数都会对其相关元素进行更改。我不知道错误在哪里,我至少要问你,我应该在哪里查找它。

感谢您的关注!

【问题讨论】:

  • 您尝试过多线程方法吗?如果您还没有调查,可能值得调查。
  • 我的猜测是,您正在泄漏 GDI 资源。当这些用尽时,控件无法重新绘制自己。在任务管理器中,打开“GDI对象”一栏,看看你的进程是否消耗了过多的对象。
  • @IgorTandetnik 这看起来很合理,我会检查一下!

标签: windows winapi visual-c++ mfc


【解决方案1】:

答案最初是在评论部分提供的。我的代码确实存在导致这种行为的 GDI 资源泄漏。

【讨论】:

    【解决方案2】:

    当一个按钮被点击时,你是在做一堆处理,还是快速返回?如果您不返回,可能会锁定 UI 线程。用户按下按钮后,在 OnClick 完成运行之前需要多长时间?

    如果是这样,这里有更多信息:https://docs.microsoft.com/en-us/windows/desktop/Win7AppQual/preventing-hangs-in-windows-applications

    对于 UI 点击上的长时间运行逻辑,我通常使用的解决方案是在后台线程中运行它。

    【讨论】:

    • 不,不是这样。 OnBnXXXClicked 系列中的每个函数都在单独的线程中运行另一个函数。所以是的,这是立即返回。
    猜你喜欢
    • 2019-12-01
    • 1970-01-01
    • 2017-02-14
    • 2019-01-20
    • 2017-07-29
    • 2011-06-19
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多