A组件实现IA接口,使用套间线程模式。
IA接口有一函数IAFunc。A组件实现IAFunc函数时,内部为一死循环,等待超时退出或等待取消信号(一成员变量)退出。
在循环内部添加了消息处理部分:
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE){
DispatchMessage(&msg);}
程序TEST(MFC Dialog)中通过#import导入了A组件,TEST的主线程通过CoInitialize(NULL)进行COM初始化。在主线程中通过智能指针.CreateInstance创建了一个对象,调用正常。问题出现在下面:
通过CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream函数将在主线程中创建的对象传递到工作线程(非UI线程,无消息循环)时,在工作线程中调用该对象的IAFunc函数时,会导致主线程UI无响应。
如果不使用列集,而直接传递智能指针到线程函数的参数,在线程中将该参数再直接用reinterpret_cast转换为A对象的智能指针,在工作线程中调用该对象的IAFunc函数时,不会导致主线程UI无响应。
工作线程中通过CoInitialize(NULL)初始化(也尝试过使用CoInitializeEx(NULL,COINIT_APARTMENTTHREADED),结果一样)。原因为何?应该如何解决?
IA接口有一函数IAFunc。A组件实现IAFunc函数时,内部为一死循环,等待超时退出或等待取消信号(一成员变量)退出。
在循环内部添加了消息处理部分:
MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE){
DispatchMessage(&msg);}
程序TEST(MFC Dialog)中通过#import导入了A组件,TEST的主线程通过CoInitialize(NULL)进行COM初始化。在主线程中通过智能指针.CreateInstance创建了一个对象,调用正常。问题出现在下面:
通过CoMarshalInterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream函数将在主线程中创建的对象传递到工作线程(非UI线程,无消息循环)时,在工作线程中调用该对象的IAFunc函数时,会导致主线程UI无响应。
如果不使用列集,而直接传递智能指针到线程函数的参数,在线程中将该参数再直接用reinterpret_cast转换为A对象的智能指针,在工作线程中调用该对象的IAFunc函数时,不会导致主线程UI无响应。
工作线程中通过CoInitialize(NULL)初始化(也尝试过使用CoInitializeEx(NULL,COINIT_APARTMENTTHREADED),结果一样)。原因为何?应该如何解决?
解决方案 »
- 急!CreateCompatibleBitmap如何创建透明位图?
- 是有关于PE结构的问题,麻烦答人进来看看!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 我在制作工具条,在MainFrame的OnCreate里,写了这样一段为什么有错??我做得是跟IE效果一样的。
- MDI程序中建立子窗口时如何检测其对应的文档、视的类型?
- 怎样运行外部exe文件,让它自动执行一个文件?
- 关于如何终止线程的问题
- 怎么取进程会计信息
- 绕口的问题!!
- 哪里有vc6自带的ActiveX控件的使用方法?
- 小问题,endpoint是什么意思?
- 这行代码什么意思
- 我想让list control控件随窗口最大化而最大化,请高手指教!
不知道具体卡死在哪个地方....
组件设计也是有问题的,不要在接口方法里面执行死循环或者等待操作,应该马上返回,否则容易陷入死锁。如果你要在组件中等待某个信号,尝试启动一个线程来等待,收到信号后再通过连接点的方式通知调用者。
组件(APARTMENT):HRESULT IAFunc(...){while(true){if(超时)return S_FALSE;//超时时间一般设为数十秒......//此处做实际工作MSG msg;while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){TranslateMessage(&msg);DispatchMessage(&msg);}}}测试工程是MFC based on dialog工程,通过import导入组件生成的dll,在工程中使用IDE生成的智能指针.主对话框的OnInitDialog函数伪代码如下:BOOL CXDialog::OnInitDialog(){CoInitialize(NULL);组件.CreateInstance;IStream *pStream;CoMarshanInterThreadInterfaceInStream(...,&pStream);CreateThread(threadFunc,pStream);return TRUE;}threadFunc伪代码如下:UINT threadFunc(LPVOID param){CoInitialize(NULL);IMyInterface *pInterface;CoGetInterfaceAndReleaseStream(IID_IMyInterface,&pInterface,(IStream *)param);pInterface->IAFunc();pInterface->Release();CoUninitialize();return 0;}以上代码中省略了错误检查,测试过程中也未发生其它错误.代码执行的现象是堵塞了主线程(主对话框)的UI.
看了您的ATL实现的CDHtmlDialog模板类v1.03,很是景仰,给分.