【问题标题】:MFC CDHtmlDialog hangs after loading a page many timesMFC CDHtmlDialog 在多次加载页面后挂起
【发布时间】:2017-09-07 12:46:07
【问题描述】:

标题说明了一切。在我们的应用程序运行数小时或数天后,我在我们的信息亭应用程序中遇到了问题。我将它提炼为 CDhtmlDialog 的 Navigate() 或其他任何功能。

Windows 10、Visual Studio 2013 社区版、共享 DLL 中的 MFC

在一个简单的、新生成的基于 MFC 对话框的应用程序中重现了该问题,该应用程序具有一个基于 CDHtmlDialog 的模式对话框。

在该对话框中,我所做的只是设置一个计时器,它每隔一秒左右调用一次以重新加载页面。这是定时器例程。

void CDHtmlStressDlg::OnTimer(UINT nIDEvent)
{
  Navigate(L"C:\\temp\\html\\test.html");
}

几百到几千次加载(不确定)后 - 整个 UI 冻结。如果我尝试将消息发布到窗口(这是我在旧应用程序中尝试过的) - 我收到错误 1816 - (配额不足)。不知道它是否相关,只是我观察到的一件事。

这是挂起后的线程转储(注意,我没有创建自己的任何线程,这都是 MFC 的东西):

Not Flagged     764 0   Worker Thread   msvcrt.dll!_threadstartex   jscript9.dll!Event::Wait    Normal
Not Flagged     6368    0   Main Thread Main Thread mfc120ud.dll!51fbbc54   Normal
Not Flagged     7228    0   Worker Thread   ntdll.dll!TppWorkerThread   ntdll.dll!_NtWaitForWorkViaWorkerFactory@20 Normal
Not Flagged     7936    0   Worker Thread   ntdll.dll!TppWorkerThread   ntdll.dll!_NtWaitForWorkViaWorkerFactory@20 Normal
Not Flagged     4284    0   Worker Thread   ntdll.dll!TppWorkerThread   ntdll.dll!_NtWaitForWorkViaWorkerFactory@20 Normal
Not Flagged     7844    0   Worker Thread   msvcrt.dll!_threadstartex   mshtml.dll!Memory::Recycler::ThreadProc Below Normal
Not Flagged     7252    0   Worker Thread   mshtml.dll!CExecFT::StaticThreadProc()  mshtml.dll!Memory::HeapBucketT<Memory::SmallNormalHeapBlockT<SmallAllocationBlockAttributes> >::SweepBucket Normal
Not Flagged     7172    0   Worker Thread   ntdll.dll!TppWorkerThread   ntdll.dll!_NtWaitForWorkViaWorkerFactory@20 Normal
Not Flagged     7176    0   Worker Thread   mshtml.dll!CExecFT::StaticThreadProc()  mshtml.dll!CTimerMan::ThreadExec    Normal
Not Flagged     6252    0   Worker Thread   ntdll.dll!TppWorkerThread   ntdll.dll!_NtWaitForWorkViaWorkerFactory@20 Normal
Not Flagged     7812    0   Worker Thread   winmm.dll!mciwindow win32u.dll!_NtUserGetMessage@16 Highest
Not Flagged >   5836    0   Worker Thread   mshtml.dll!CExecFT::StaticThreadProc()  combase.dll!CCliModalLoop::BlockFn  Normal
Not Flagged     404 0   Worker Thread   mshtml.dll!CExecFT::StaticThreadProc()  combase.dll!CCliModalLoop::BlockFn  Normal
Not Flagged     6920    0   Worker Thread   msvcrt.dll!_threadstartex   jscript9.dll!Recycler::ThreadProc   Below Normal

这是我正在加载的 html

<!DOCTYPE html>
<html>
<head>
    <style>
        body {
            overflow: hidden; /*suppress scroll bars*/
        }

        .box {
            display: inline-block;
            border-spacing: 0;
            border-collapse: collapse;
            font-family: Arial;
            transform: rotate(90deg);
            display: inline-block;
        }

        .line1 {
            font-size: 210%; 
            color: Coral;
            width: 1100px;
            transform: translate(45%, 1120%); 
            text-align: center;
        }

        .pic1 {            
            width: 230px;
            transform: translate(0%, -30px);
        }
    </style>
</head>

<body id=CHtmlMirror bgcolor=black>

    <div class="box">
        <div class="line1">Test Line to load</div>
    </div>

    <table border=0 class="pictureTable">
        <tr><td><p><img class="pic1" src=file://c:/temp/icons/pic1.jpg></p></td></tr>
    </table>

</body>
</html>

【问题讨论】:

  • 您的 UI 是否分布在多个线程中?
  • 我没有在 MFC 生成的之上做任何额外的线程。从字面上看,只需添加几行代码即可添加计时器并加载页面。
  • 所以,澄清一下,是的,“我所做的”一切都发生在主 UI 线程上
  • 您可以尝试 Navigate2 方法而不是 Navigate ...只是一个想法...

标签: windows winapi visual-c++ mfc


【解决方案1】:

只有当正在加载的 HTML 页面也正在从外部应用程序(或线程,无关紧要)修改时,此问题才会重现。在这种情况下没有加载错误 - 只是“终端情况” UI 冻结。

为了解决这个问题,我们确保在文件开始加载时没有人可以触摸文件。一旦保证了这一点,就无法重现挂起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2014-05-20
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多