Windows MFC CDHtmlDialog在多次加载页面后挂起
标题说明了一切。在我们的应用程序运行了数小时或数天之后,我在我们的kiosk应用程序中遇到了一个问题。我将其提取到CDhtmlDialog的Navigate(),或者它所做的任何事情 Windows 10,Visual Studio 2013社区版,共享DLL中的MFC 在一个全新生成的基于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
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>