2011-05-12 28 views
1

我目前正在玩微軟WebBrowser ActiveX控件,我注意到我可以通過加載一個崩潰嵌入式IE的網頁來凍結我的整個程序。 所以我想知道是否有辦法阻止整個程序被凍結?C++/MFC - 防止掛起的孩子(ActiveX)控制凍結整個用戶界面?

我已經嘗試過: - 創建一個新的CWinThread創建/處理控制 - >同樣的結果 - 從這個線程建立創建一個新的對話框/處理控制 - >同樣的結果

的問題似乎在消息系統中很深,但我不確定。

任何人都可以告訴我,如果它甚至可以防止整個UI /對話框凍結,並導致這個問題?

(我已在網上搜索,但我無法找到任何真正的解決辦法)

感謝名單,加里

PS:唯一的辦法,目前對我的作品是創建一個新的子進程加載/處理控制。我可以修改它,使它看起來像我的主對話框的子窗口,但這使我能夠直接從我的主對話框代碼訪問控件。

編輯:

好吧,我發現,我滿意的解決方案。我在主應用程序中創建一個佔位符窗口,並啓動一個包含實際控件的新子進程。我委託所有窗口移動/大小/等。消息傳遞給子進程,以便它可以重新定位/作出反應。 重要的是不要將我的主應用程序中的新進程創建爲WS_CHILD對象,因爲這樣它仍然會凍結它。 我通過內存映射與進程共享信息,並使用自定義用戶消息進行交流。 我希望它會更容易...

+0

如果您創建一個新線程,那麼如果線程中的代碼崩潰,則不會保護應用程序的其餘部分。你可能有一個未處理的異常,這就是程序崩潰的原因。你必須確保你抓住並處理所有事情。如果你有硬件異常(除以0,訪問無效內存),你可以用結構化異常處理(http://msdn.microsoft.com/en-us/library/ms680657%28v=vs.85%)來捕獲和處理它們29.aspx)。 – 2011-05-12 17:50:40

回答

0

這是一個非常複雜的領域。防止一個UI對象中的問題導致直接相關的父UI對象出現問題,這對瀏覽器人員來說已經花費了大量時間,他們試圖確保一個選項卡不會使另一個選項卡崩潰。我認爲可以公平地說,這是火箭科學,在這裏描述的話題太大了。

您已經選擇了一個好的起點(將框架分隔成一個新的過程)。還有一些你想了解的是線程輸入隊列和AttachThreadInput(http://msdn.microsoft.com/en-us/library/ms681956(VS.85).aspx)。雷蒙德也有一些內容。包括PDC講話的一部分http://blogs.msdn.com/b/oldnewthing/archive/2008/08/01/8795860.aspx

額外的建議:這裏的另一種選擇可能是簡單地禁止在瀏覽器控件中加載AX控件,如果你不需要它們的話。如果你確實需要它們,並且正在構建一個非常普遍的瀏覽替代品,那麼你應該預測很多工作來複制你在主瀏覽器中找到的穩定性。