首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2013-12-04 
多线程中使用COM问题,急盼高手或版主!刚接触多线程编程。麻烦的是还要涉及到COM使用。急盼高人、版主解答啊!!

多线程中使用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,并且尽量不要去交互

热点排行