COM调用改TCP/IP问题,请高手赐教

whitecandy 2006-08-04 03:37:41
1.COM改TCP/IP原因:由于涉及到多个客户端调用com接口,并需要接受服务端的事件返回,系统运行中出现了程序无反应现象,虽然不频繁,但很致命,找不到解决的方法,所以通过改造COM接口为TCP/IP消息方式解决该问题.

2.修改目标,客户端程序改动尽量少,希望能按com调用方式(阻塞式)进行访问.

3.考虑的方案1:客户端中的每个对象均创建为线程,由于调用com接口的对象很多,最大需要支持4000个,也就是说要创建4000个线程,在windows 2000 中大概只能创建成功2000个左右.

4.考虑的方案2:客户端对象的函数中调用com接口时,修改为发送tcp/ip消息后,记录当前栈地址,收到返回结果取出堆栈地址,进行执行跳转,目前还没有做过这方面的试验,不知道是否可行,难度是否大.

5.考虑的方案3:每个COM修改为TCP/IP方式,发送前传入回调函数地址,收到返回消息时回调该函数,该非法肯定可行,但改动会很大.

附:简单的客户端对象
TMyObject =class
procedrue AAA;
..........
end;


TMyObject.AAA(c:Integer);
begin
XXXXXX.add(1,2);
XXXXXX.sub(2,3);
end;

在TMyObject中,类似AAA的函数很多,而且函数内可能包含10几个COM调用,现在需要把每个COM调用都改为TCP/IP,并需要判断每个的结果.
...全文
417 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
whitecandy 2006-08-30
  • 打赏
  • 举报
回复
公司内部将组织相关人员进行讨论,必要的时候,编写两种实现方式进行验证,决定使用什么方案,谢谢大家的回复。
whitecandy 2006-08-15
  • 打赏
  • 举报
回复
首先感谢halfdream(哈欠) 朋友的建议,昨天发完该帖回复后,我看了一下Delphi的Pooler例子,这种方法和原先的COM方式并没有本质的区别(出现程序无响应仍没有解决方法),由于我们公司的系统用于电信运营商,所以稳定,可靠是首位的,公司目前已基本确定将服务端的COM接口修改为TCP接口,而我负责的业务程序,是客户端,基本上是只能修改客户端,封装TCP消息,以便程序内部能够按COM阻塞方式调用,因此COM改TCP已经是势在必行了,服务器端的也只接受TCP消息,所以现在的问题是客户端的问题.
TCP确非本人所长,不过普通的编码应该不成问题,呵呵,业务程序访问数据库,从原先的通过IAppserver接口访问已经修改为TCP/IP访问,所以TCP/IP实现应该不会是技术障碍了;)
halfdream 2006-08-15
  • 打赏
  • 举报
回复
如果确定用TCP..客户端代码倒是应该没有太多难点的.
你们系统负荷应该是比较大的..在主线程阻塞方式SOCKET交易仍可能冻结界面..不过好在容易控制些.
whitecandy 2006-08-14
  • 打赏
  • 举报
回复
我的一个同事,通过修改delphi IDE的project ->options,在Project Options的Linker页面,将Memory Sizes中的Max stacksize从$00100000 修改为$00010000,解决了创建线程数量的限制,我做了一下试验,可以创建1-2万个线程,不过修改这个值不知道是否对程序有影响,另外创建线程的方法出错的可能比较大
我将分析线程池的例子,确定是否可用线程池解决.
在此感谢各位朋友的答复,谢谢.

halfdream 2006-08-14
  • 打赏
  • 举报
回复
不主张COM调用改TCP/IP...特别看楼主例出的方案,看来TCP也不是楼主特别熟悉的技术.
这样的话,这样的修改风险非常大.


DELPHI的POOLER应该只看作一个学习理解对象池的示例..

真正要用对象池..可以用COM+的对象池..
可以达到相当好的服务能力.
当然,注意你的COM对象要按COM+的要求稍作修改..
比如无状态对象,实现IObjectControl接口.

Cassava 2006-08-08
  • 打赏
  • 举报
回复
例子在
C:\Program Files\Borland\Delphi7\Demos\Midas\Pooler
至于池的概念可以在网上找资料
bluz 2006-08-07
  • 打赏
  • 举报
回复
没有完全看懂你的意思,如果你的客户端和服务端均在同一台机器上,那么你就是用的进程外COM了,如果同一台机器上启用4000个并发的tcp连接,那么性能会很难接受的
whitecandy 2006-08-07
  • 打赏
  • 举报
回复
dabaicai(一直是菜鸟):
首先谢谢你的回复,不过你可能误解了我的意思,假如COM接口有100个,一个客户端程序与服务端程序用来发送消息的TCP连接只需要一个,用线程的目的只是为了控制调用COM接口时,可以阻塞该调用,避免程序改动过大.而同时调用接口的可能性为TMyObject的个数(每个对象在一个消息周期,只能调用一个COM接口),最大可能为4000左右,创建少量的线程,也许可行,不过我想不到如何管理.
dabaicai 2006-08-07
  • 打赏
  • 举报
回复
难道COM里面不是对一个TCP连接建立一个线程来处理吗? 如果不是那就改COM吧

就是方案5

另外可以考虑的是利用线程list, 每个连接使用后即断开该连接,但是threadlist中并不释放,只是定时检查一下是否还是连接,没有连接上再释放

再或者看一下单一模式的方法是否可以在你的应用中使用
whitecandy 2006-08-07
  • 打赏
  • 举报
回复
Cassava(车超) :
对象池技术,我不怎么了解,是否可简单介绍一下,或者指点一下是哪个例子,谢谢.
whitecandy 2006-08-07
  • 打赏
  • 举报
回复
bluz:

如果你原来使用的是DCOM,DCOM的实际上也是用TCP/IP,因此你改成TCP/IP方式是多此一举。

由于你需要的连接数大,改成TCP/IP可能稳定性更差。

答:由于在使用COM的过程中,曾出现COM客户端和服务端互锁,导致程序无响应,也许是COM的使用方法有问题(多个客户端调用COM接口,COM服务器也有事件,需要主动发送给客户端,因为要寻找连接点,所以在COM服务器端增加了定时发送COM事件给各客户端,而客户端为了检测服务端异常或退出后,能自动重新创建接口,所以同样有定时调用某个接口,客户端和服务端均在同一台机器上),由于公司在这方面的技术储备不强,所以没人能解决该问题,所以设想改造COM调用为TCP/IP调用,出现问题容易查,至少是不会出现程序无响应的.所以不太会使用DCOM解决



whitecandy 2006-08-07
  • 打赏
  • 举报
回复
dabaicai(一直是菜鸟) :
不解
现在需要把每个COM调用都改为TCP/IP,并需要判断每个的结果>??????????????

答:是的,现在的编码中,一个函数中可能包含多个COM调用,现在需要通过TCP/IP发包后等待返回,所以改动相当麻烦


Cassava 2006-08-05
  • 打赏
  • 举报
回复
应该使用对象池技术解决,delphi中带有一个例子,自己看看吧
bluz 2006-08-04
  • 打赏
  • 举报
回复
如果你原来使用的是DCOM,DCOM的实际上也是用TCP/IP,因此你改成TCP/IP方式是多此一举。

由于你需要的连接数大,改成TCP/IP可能稳定性更差。
dabaicai 2006-08-04
  • 打赏
  • 举报
回复
不解
现在需要把每个COM调用都改为TCP/IP,并需要判断每个的结果>??????????????
天涯倦客 2006-08-04
  • 打赏
  • 举报
回复
么看明白..

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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