2017-04-11 62 views
0

標題說明了一切。在我們的應用程序工作數小時或數天後,我在我們的自助服務終端應用程序中遇到了問題。我將它提取到CDhtmlDialog的Navigate(),或者它做的任何事情。MFC CDHtmlDialog多次加載頁面後掛起

的Windows 10時,Visual Studio 2013社區版,MFC在共享DLL

在裸機轉載的問題,新生成的基於對話框的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 [email protected] Normal 
Not Flagged  7936 0 Worker Thread ntdll.dll!TppWorkerThread [email protected] Normal 
Not Flagged  4284 0 Worker Thread ntdll.dll!TppWorkerThread [email protected] 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 [email protected] 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 [email protected] Normal 
Not Flagged  7812 0 Worker Thread winmm.dll!mciwindow [email protected] 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> 
+1

您的UI是否跨越多個線程? – IInspectable

+0

我不會在MFC生成的任何其他線程上執行任何操作。從字面上看,只需添加幾行代碼即可添加計時器並加載頁面。 – user2349195

+0

因此,爲了澄清,是的,我所做的一切正在主UI線程上發生 – user2349195

回答

0

只有在加載的HTML頁面也從外部應用程序(或線程,無所謂)修改時,此問題纔可重現。在這種情況下沒有加載錯誤 - 只是一個「終端案例」UI凍結。

要解決這個問題,我們確保在開始加載時沒有人能夠觸摸該文件。一旦這個保證,掛起不能被複制。