读书人

多线程中使用COM有关问题盼高手或版

发布时间: 2013-12-04 17:21:02 作者: rapoo

多线程中使用COM问题,急盼高手或版主!
刚接触多线程编程。麻烦的是还要涉及到COM使用。急盼高人、版主解答啊!!
程序中需要用到对EXCEL操作。
设计个CData类,有EXCEL操作类指针m_pexcel,包含打开APP的函数

BOOL CData::OpenExcelApp()
{
m_pexcel=new CExcel;

if (!m_pexcel->CreatApp(FALSE))
{
return FALSE;
}
else
{return TRUE;}
}

CData类中有个CString链表 m_list,用于接收字符串数据。
需要进行 m_pexcel->write(&m_list)操作。写到EXCEL文本中。
构造函数中进行COM初始化。
CData::CData()
{
CoInitialize(NULL);
}
CData::~CData()
{
CoUninitialize();
}

在主程序中定义了个 CData m_data 对象。主程序中不定时往m_data.m_list中写数据。
子线程要获得这个m_data,读取m_data.m_list写数据到文本。
主程序中启动线程
void Ctest::StartThread() 
{
CWinThread *pWriteD=AfxBeginThread(WriteData,
(LPVOID)&m_nData,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);

pWriteD->ResumeThread();
}

全局线程函数
UINT WriteData(LPVOID pParam)
{
CData *p=(CData*)pParam;
while (WaitForSingleObject(eventWriteD.m_hObject,INFINITE)==WAIT_OBJECT_0)
{
p->Write();//该函数内部执行m_pexcel->write(&m_list)操作
}
return 0;
}

执行到p->Write()时出错。有人提醒COM控件初始化在子线程中要重新初始化。
请问:
(1)如何在子线程中初始化COM。WriteData函数中添加 CoInitialize(NULL)吗?
(2)把主程序中的m_data传给子线程的方法对不对?
(3)在线程中执行 p->Write()时,主线程中能往m_data.m_list写数据吗?网上说WaitForSingleObject会挂起主线程。是主线程不能工作了吗? 多线程?com 多线程 COM
[解决办法]
1:凡是使用com的线程好像都要调用CoInitializeEx/CoInitialize来进入一个套间
2:对
3:你这是在子线程write数据么。WaitForSingleObject会挂起当前线程而不是主线程
[解决办法]
除非你知道多线程套间是什么,否则请一律使用STA(单线程套间)
每个使用COM的线程都必须执行COM初始化
工作线程使用COM时,只能作为主动调用方,不能使用连接点,如果要使用连接点,工作线程必须有消息循环
。。。
还有好多要注意的,还是慢慢啃吧
[解决办法]
就是说让你在每个线程内都去CoInitialize,并且尽量不要去交互

读书人网 >VC/MFC

热点推荐