我现在遇到了一个问题。情况如下:
主线程主持主窗口。
主线程创建一个子窗口。
主线程创建子线程。
子线程创建IE控件。
子线程将IE Control附加到子窗口。
问题是一旦子线程阻塞(例如:: 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);
}
}
}
有人可以帮我解决这个问题吗?
答案 0 :(得分:0)
您不能只在另一个线程上创建COM对象(和UI)并将它们传递给主线程。为什么不创建你像其他人一样在主线程上创建它?
我认为将UI传递给另一个线程是非常不可能的(主窗口和子控件的消息循环托管在不同的线程上,而子/父通知也不起作用)。
至于COM,你需要为COM初始化两个线程并在它们之间编组指针:http://msdn.microsoft.com/en-us/library/ms678428(v=vs.85).aspx
答案 1 :(得分:0)
原因是父窗口需要将消息与其子窗口同步,该子窗口由另一个线程托管。所以两个线程有某种连接。一个被阻止,另一个被阻止!