写个多线程的COM组建 我想 在COM组建里 写几个线程,一个TCP 的接收 ,一个TCP 的发送,线程的开启该怎么写呢?写在哪里?(写在DLLmain 里?) 跟WIN32 的写法一样吗? 头痛啊,COM的线程模型 有点糊涂,不知道怎么弄,如果 跟WIN32差别很大,还望给个例子啊 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可普通的Win32线程使用基本一样.线程开启可以通过事件或接口的方法中开启.COM线程需要注意的是接口传递,必去使用列集散集的模式传递接口,使用CoMarshallnterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream函数 你在COM组件里启动线程跟Win32没啥区别,不要把这跟COM组件的线程模型搞混,COM组件的线程模型主要是针对调用者而言的。 恩,是有点搞糊涂了, 那如果 我是 一个客户程序调用 的话,里面有不同的对话框 界面 来 使用COM组建的接口,那就应该考虑 COM组建的线程模型了吧 ? 先用MFC写好,调试完,然后移植进COM,引出接口, 就写普通的win32程序封装成com就可以了 DWORD m_dwThread; //线程启动标致 BOOL m_bCreatFunc; // 线程的句柄 HANDLE m_HandleThread; DWORD WINAPI XXXXXX::RecvDataProc(LPVOID lParam) { ((XXXXXX*)lParam)->RecvDataFunc(); return 0; } int XXXXXX::RecvDataFunc() { while(m_bCreatFunc) { //这里面是放线程工作的内容 } return 1; } //创建接收线程 int XXXXXX::CreateRecvDataThrd() { if(m_HandleThread==NULL) { m_HandleThread = CreateThread(NULL,0,RecvDataProc,this,0,&m_dwThread); if(m_HandleThread == NULL) { TRACE("创建接收消息线程失败!!\n"); return 1; } else { m_bCreatFunc = TRUE; TRACE("创建接收消息线程成功!!\n"); } } return 0; } 首先看你是否会把一个对象的指针在多个线程间使用,跟有几个对话框界面没关系的。如果你每个线程都是一个独立的对象,并且COM组件里也没用到全局的变量等,根本就不用考虑线程模型。如果你的一个对象支持在不同线程里使用,这时你就要考虑COM组件线程模型以及套件等。这部分比较绕,有时不能立刻理解。具体可以参考网上别人对这两个概念的理解,随便Google了一个:http://blog.csdn.net/crybird/archive/2008/10/11/3057067.aspx 看你这个需求,应该跟普通WIN32应用程序线程一样 请问一个处理数据的问题? 分不多了 从VC6.0 转到 VC 9.0出现的问题,实在找不出为何,把错误贴出来了。 控制台应用程序怎么能显示资源视图 MFC初学者的困惑 为什么Release版本可以,Debug版本不可以呀 在WINDOWS网络-配置中为网卡添加了TCP/IP协议,则WINDOWS添加了下列网络组件,请那位大侠解释一下 不用C++的STL,而是用File类读取txt文件,要求不预知文件大小。 一个网页源码(中间存在大量冒号)怎么把他连接成一个字符串呢 请看看我的代码: MFC生存期的问题 问问大家关于Directshow
COM线程需要注意的是接口传递,必去使用列集散集的模式传递接口,使用CoMarshallnterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream函数
恩,是有点搞糊涂了, 那如果 我是 一个客户程序调用 的话,里面有不同的对话框 界面 来 使用COM组建的接口,那就应该考虑 COM组建的线程模型了吧 ?
封装成com就可以了
//线程启动标致
BOOL m_bCreatFunc;
// 线程的句柄
HANDLE m_HandleThread; DWORD WINAPI XXXXXX::RecvDataProc(LPVOID lParam)
{
((XXXXXX*)lParam)->RecvDataFunc();
return 0;
} int XXXXXX::RecvDataFunc()
{ while(m_bCreatFunc)
{
//这里面是放线程工作的内容
}
return 1;
} //创建接收线程
int XXXXXX::CreateRecvDataThrd()
{
if(m_HandleThread==NULL)
{
m_HandleThread = CreateThread(NULL,0,RecvDataProc,this,0,&m_dwThread); if(m_HandleThread == NULL)
{
TRACE("创建接收消息线程失败!!\n");
return 1;
}
else
{
m_bCreatFunc = TRUE;
TRACE("创建接收消息线程成功!!\n");
}
} return 0;
}
首先看你是否会把一个对象的指针在多个线程间使用,跟有几个对话框界面没关系的。如果你每个线程都是一个独立的对象,并且COM组件里也没用到全局的变量等,根本就不用考虑线程模型。
如果你的一个对象支持在不同线程里使用,这时你就要考虑COM组件线程模型以及套件等。这部分比较绕,有时不能立刻理解。具体可以参考网上别人对这两个概念的理解,随便Google了一个:
http://blog.csdn.net/crybird/archive/2008/10/11/3057067.aspx