C++/MFC - 防止挂起的子 (ActiveX) 控件冻结整个 UI?
Posted
技术标签:
【中文标题】C++/MFC - 防止挂起的子 (ActiveX) 控件冻结整个 UI?【英文标题】:C++/MFC - Preventing a hanging child (ActiveX) control from freezing the whole UI? 【发布时间】:2011-05-12 15:59:30 【问题描述】:我目前正在使用 Microsoft 的 WebBrowser ActiveX 控件,我注意到我可以通过加载使嵌入式 IE 崩溃的网页来冻结整个程序。 所以我想知道是否有任何方法可以防止整个程序冻结?
我已经尝试过: - 创建一个新的 CWinThread 创建/处理控件 --> 相同的结果 - 从这个线程创建一个新的对话框创建/处理控件 --> 相同的结果
问题似乎在消息系统中很深,但我不确定。
谁能告诉我是否有可能阻止整个 UI/Dialog 冻结以及导致此问题的原因是什么?
(我已经在网上搜索过,但找不到任何真正的解决方案)
谢谢,加里
PS:目前对我有用的唯一方法是创建一个新的子进程加载/处理控件。我可以修改它,使它看起来像我的主对话框的子窗口,但这需要我直接从我的主对话框代码访问控件的能力。
编辑:
好的,我找到了令我满意的解决方案。我正在主应用程序中创建一个占位符窗口并启动一个包含实际控件的新子进程。我委托所有窗口移动/大小/等。给子进程的消息,以便它可以重新定位/反应。 重要的是不要从我的主应用程序中将新进程创建为 WS_CHILD 对象,因为那样它仍然会冻结它。 我通过内存映射与进程共享信息,并使用自定义用户消息进行通信。 我希望它会更容易......
【问题讨论】:
如果您创建一个新线程,如果线程中的代码崩溃,这将无法保护应用程序的其余部分。您可能有一个未处理的异常,这就是程序崩溃的原因。你必须确保你抓住并处理一切。如果您有硬件异常(除以 0,访问无效内存),您可以使用结构化异常处理 (msdn.microsoft.com/en-us/library/ms680657%28v=vs.85%29.aspx) 捕获和处理它们。 【参考方案1】:这是一个非常复杂的领域。防止一个 UI 对象中的问题导致直接相关的父 UI 对象出现问题对于浏览器人员来说是一件耗费大量时间的事情,他们试图确保一个选项卡不会使另一个选项卡崩溃。我认为可以公平地说这是火箭科学,而且这个话题太大了,无法在这里描述。
您选择了一个好的起点(将框架分离到一个新进程中)。您还想了解线程输入队列和 AttachThreadInput (http://msdn.microsoft.com/en-us/library/ms681956(VS.85).aspx)。雷蒙德对此也有一些内容;包括部分 PDC 谈话http://blogs.msdn.com/b/oldnewthing/archive/2008/08/01/8795860.aspx。
额外建议:这里的替代方法可能是简单地禁止在您的浏览器控件中加载 AX 控件(如果您不需要它们)。如果您确实需要它们并且正在构建一个非常通用的浏览器替代品,那么您应该预期需要做大量工作来复制您在主要浏览器中发现的稳定性。
【讨论】:
以上是关于C++/MFC - 防止挂起的子 (ActiveX) 控件冻结整个 UI?的主要内容,如果未能解决你的问题,请参考以下文章