Windows MFC CDHtmlDialog在多次加载页面后挂起

Windows MFC CDHtmlDialog在多次加载页面后挂起,windows,winapi,visual-c++,mfc,Windows,Winapi,Visual C++,Mfc,标题说明了一切。在我们的应用程序运行了数小时或数天之后,我在我们的kiosk应用程序中遇到了一个问题。我将其提取到CDhtmlDialog的Navigate(),或者它所做的任何事情 Windows 10,Visual Studio 2013社区版,共享DLL中的MFC 在一个全新生成的基于MFC对话框的应用程序中重现了这个问题,该应用程序具有基于CDHtmlDialog的模态对话框 在该对话框中,我所做的只是设置一个计时器,每隔一秒左右调用一次以重新加载页面。下面是计时器例程 void CDH

标题说明了一切。在我们的应用程序运行了数小时或数天之后,我在我们的kiosk应用程序中遇到了一个问题。我将其提取到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的内容):

未标记764 0工作线程msvcrt.dll_threadstartex JScript 9.dll!事件::等待正常
未标记6368 0主线程主线程mfc120ud.dll!51fbbc54正常
未标记7228 0工作线程ntdll.dll!TppWorkerThread ntdll.dll_NtWaitForWorkViaWorkerFactory@20正常的
未标记7936 0工作线程ntdll.dll!TppWorkerThread ntdll.dll_NtWaitForWorkViaWorkerFactory@20正常的
未标记4284 0工作线程ntdll.dll!TppWorkerThread ntdll.dll_NtWaitForWorkViaWorkerFactory@20正常的
未标记7844 0工作线程msvcrt.dll_threadstartex mshtml.dll!内存::回收器::ThreadProc低于正常值
未标记7252 0工作线程mshtml.dll!CExecFT::StaticThreadProc()mshtml.dll!内存::HeapBucketT::清扫桶正常
未标记7172 0工作线程ntdll.dll!TppWorkerThread ntdll.dll_NtWaitForWorkViaWorkerFactory@20正常的
未标记7176 0工作线程mshtml.dll!CExecFT::StaticThreadProc()mshtml.dll!CTimerMan::ThreadExec Normal
未标记6252 0工作线程ntdll.dll!TppWorkerThread ntdll.dll_NtWaitForWorkViaWorkerFactory@20正常的
未标记7812 0工作线程winmm.dll!mciwindow win32u.dll_NtUserGetMessage@16最高
未标记>5836 0工作线程mshtml.dll!CExecFT::StaticThreadProc()combase.dll!CCliModalLoop::BlockFn正常
未标记404 0工作线程mshtml.dll!CExecFT::StaticThreadProc()combase.dll!CCliModalLoop::BlockFn正常
未标记6920 0工作线程msvcrt.dll_threadstartex JScript 9.dll!回收器::ThreadProc低于正常值
这是我正在加载的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>

身体{
溢出:隐藏;/*抑制滚动条*/
}
.盒子{
显示:内联块;
边界间距:0;
边界塌陷:塌陷;
字体系列:Arial;
变换:旋转(90度);
显示:内联块;
}
.line1{
字号:210%;
颜色:珊瑚;
宽度:1100px;
转换:翻译(45%,1120%);
文本对齐:居中;
}
.pic1{
宽度:230px;
转换:转换(0%,-30px);
}
负载测试线


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


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

您的UI是否分布在多个线程上?我不会在MFC生成的线程之上再执行任何其他线程。从字面上说,只是添加几行代码来添加计时器和加载页面。因此,为了澄清,是的,所有“我做”的事情都发生在主UI线程上。您是否可以尝试Navigate2方法而不是Navigate。。。只是一个想法……这有什么帮助吗:
<!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>