【发布时间】: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