菜鸟问题,在线等待:COM中如何使用多线程(ATL)???有效有分,急急急!!!!

cboy2wzhx 2003-01-09 10:06:57
问题描述:本人写了一个用于传输VEDIO的RTP通道(也就是基于SOCKET的数据传输)
使用了一个FIFO来缓冲数据,用一个线程来取出FIFO里的数据进行网络广播,另一个线程用来检测传输状况,结果两个线程不起作用。
请高手指点!!!

|线程3 <------------------<---------------- 收到后发出反馈消息
招收反馈消息
线程1 _______________线程2 _________________
------------>| FIFO |----------> | FIFO |
接收外部数据 |_____________|取出数据广播 |________________|

发送端 招收端
...全文
84 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cboy2wzhx 2003-02-25
  • 打赏
  • 举报
回复
问题已解决,多谢各位关注!!!
kenwhale 2003-01-16
  • 打赏
  • 举报
回复
你写的组件是否支持多线程?

如果不支持的话,你别的线程中需要列集散集操作。而且,STA是线性操作,因为一次只有一个线程可以访问组件。注意deadlock。
Microsoftadherent 2003-01-15
  • 打赏
  • 举报
回复
up
zzyx 2003-01-15
  • 打赏
  • 举报
回复
俺不是高手,所以不清楚到底是怎么回事情。

但俺建议:
把你认为没有启动的两个线程重写,让它们只完成最简单的任务,如atltrace,并且不向线程传递任何参数。
并且最好重新写一个test接口,让它启动另外两个线程。
看看结果如何?然后再定位问题所在吧,不一定是线程启动的原因。

俺以前也做过COM内的多线程组件,直接调用CreateThread或_beginthreadex没有什么问题呀。

从我能想到的角度考虑
CComObjectRootEx<CComMultiThreadModel>继承
客户端CoInitializeEx参数

cboy2wzhx 2003-01-14
  • 打赏
  • 举报
回复
请高手指点哈,急急急!!!
cboy2wzhx 2003-01-13
  • 打赏
  • 举报
回复
danmao(愤怒的小mao)说得有道理,先谢谢
不过这样我也试过的,还是不行
COM用客户端程序都正常编译通过
danmao 2003-01-13
  • 打赏
  • 举报
回复
应该是c++的动态连接库问题,需要使用multithread版的动态链接库。
microyzy 2003-01-10
  • 打赏
  • 举报
回复
线程都没有启动?是不是代码有问题?
另外,使用的是MTL吗?
danmao 2003-01-10
  • 打赏
  • 举报
回复
up
cboy2wzhx 2003-01-10
  • 打赏
  • 举报
回复
用ATL写的进程内组件
代码改成MFC没有问题
本人怀疑是线程的启动方式不对,即不能用常规的CreateThread或_beginthreadex等来启动,请问哪位大侠知道COM多线程的启动方式?谢谢
zzyx 2003-01-09
  • 打赏
  • 举报
回复
呵呵,问题严重宽泛,无从下手!

什么叫线程不起作用?
和COM有什么关系?
...
详细点描述你的代码结构,并最好提供关键代码,如监测、同步,队列操作等..,也许更有帮助
ruihuahan 2003-01-09
  • 打赏
  • 举报
回复
up
cboy2wzhx 2003-01-09
  • 打赏
  • 举报
回复
线程优先级都是默认的,而且线程好像根本没有启动起来
哪位大虾有这方面的代码?小弟急等,谢谢了!!!
hu314 2003-01-09
  • 打赏
  • 举报
回复
两个线程中其中一个的优先级是不是设置得有问题
cboy2wzhx 2003-01-09
  • 打赏
  • 举报
回复
简单描述一下:
一个进程内组件:AstroRTP.dll
一个接口: IRTPackage
两个方法: IRTPackage::Get(BSTR *vpStream , DWORD *dwLen);
IRTPackage::Put(BSTR *vpStream , DWORD dwLen);

VEDIO广播发送方调用Put方法写数据
VEDIO广播接收方调用Get方法读数据
下面以发送端来说明COM组件内的线程模型:
组件内使用三个线程:

1、主线程处理客户端的请求(Get/Put)并把相应数据写入/弹出FIFO
客户调用Put()--->COM主线程--写入-->FIFO
每次Put的数据包不大与32768个字节
2、BroadCast线程负责从FIFO中取出一个数据包并进行拆成小包后广播出去(拆开为64个小包并加上RTP头,添上包的序列)

线程2调用FIFO::Popup()--->CBroadCast::BuilderPackage()--->CBroadCast::Send()
接收端每接收到一个包后会返回一个确认信息,这个信息由线程3(HeartBeat)来监听
线程3Bind()一个端口,接收从VEDIO接收端发回的信息,如成功接收,丢包、或接收方缓冲区已満等消息,并根据这些消息通知其它线程或客户作出响应


结果只有主线程成功启动,即能接收用户的Put,FIFO里有数据包,但CBroadCast不能取出包来广播出去,CHeartBeat线程也未启动。

我是在客户第一次调用Put时启动其它两个线程的,用CreateThread来启动线程,ATL Internals上有介绍COM多线程模型,但是讲得太少了,希望高手们讲得透一些
先谢谢了!!!

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧