如果子线程承载IE控件,则子线程块会使主线程阻塞

时间:2013-07-12 09:17:18

标签: c++ internet-explorer

我现在遇到了一个问题。情况如下:

主线程主持主窗口。

主线程创建一个子窗口。

主线程创建子线程。

子线程创建IE控件。

子线程将IE Con​​trol附加到子窗口。

问题是一旦子线程阻塞(例如:: Sleep(10 * 1000),主线程的GetMessage函数不能再获取消息,这意味着主线程也被阻塞了! 我不明白。为什么子线程可以影响主线程? 如果我评论attch代码。子线程的块根本不会阻塞主线程!

以下是附加代码段:

CComPtr<IUnknown> punkCtrl;
HRESULT hr = CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)&punkCtrl);
if( SUCCEEDED(hr) )
{
    m_spWebBrowser2 = punkCtrl;
    if( m_spWebBrowser2 )
    {
        CComPtr<IAxWinHostWindow> spWinHost;
        HRESULT hr = QueryHost(&spWinHost);

        if (spWinHost)
        {
            spWinHost->AttachControl(m_spWebBrowser2,m_hWnd);
        }
    }
}

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您不能只在另一个线程上创建COM对象(和UI)并将它们传递给主线程。为什么不创建你像其他人一样在主线程上创建它?

我认为将UI传递给另一个线程是非常不可能的(主窗口和子控件的消息循环托管在不同的线程上,而子/父通知也不起作用)。

至于COM,你需要为COM初始化两个线程并在它们之间编组指针:http://msdn.microsoft.com/en-us/library/ms678428(v=vs.85).aspx

答案 1 :(得分:0)

原因是父窗口需要将消息与其子窗口同步,该子窗口由另一个线程托管。所以两个线程有​​某种连接。一个被阻止,另一个被阻止!