0

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

主线程承载主窗口。

主线程创建一个子窗口。

主线程创建一个子线程。

子线程创建一个 IE 控件。

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

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

以下是附加代码片段:

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);
        }
    }
}

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

4

2 回答 2

0

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

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

至于 COM,您需要为 COM 和它们之间的封送指针初始化两个线程:http: //msdn.microsoft.com/en-us/library/ms678428 (v=vs.85).aspx

于 2013-07-12T09:31:23.840 回答
0

原因是父窗口需要将消息与其由另一个线程托管的子窗口同步。所以这两个线程有​​某种联系。一个被封锁了,另一个也被封锁了!

于 2013-07-29T02:00:46.353 回答