文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发C++Builder用C++Builder建立多线程COM服务器
精品推荐
特别推荐
·菜鸟入门 认识C#中的委托和事件
·WINDOWS下的动态鼠标光标控制
热点TOP10
·在 C++ Builder中利用串行通信控件编程
·用Builder C++设计串行口COM1或COM2的读写操作
·Windows多线程间同步事件的控制方法
·用WinSock控件编写网络聊天器
·在C++ Builder中进行DirectX编程(2)
·C++ Builder VCL库函数简介
·用C++ Builder3 制作记事本
·利用C++ Builder 5.0创建用户自己的网上聊天程序
·C++ Builder 中的自画功能
·C++Builder IDE使用技巧与快捷键
·C++ Builder下数据库报表Master/Detail关系功能的实现
·WINDOWS下的动态鼠标光标控制
·菜鸟入门 认识C#中的委托和事件
·QuickReport基本知识
·C++BUILDER中一些实现界面效果的技巧
·C#动态生成树型结构的Web程序设计
·利用C++ Builder开发动画DLL
·BCB中实现全屏幕OpenGL
·C++Builder注册表编程实例详解
·利用C++Builder遍历文件目录

用C++Builder建立多线程COM服务器

日期:2007年5月2日 作者: 查看:[大字体 中字体 小字体]


一、线程、Apartment和进程

说道COM的线程模型,大家就会想到各种Apartment模型。但Apartment究竟是什么?如何建立一个Apartment呢?

Apartment就是线程的容器,线程中有关COM的操作必须在Apartment中进行。
Apartment分为STA和MTA两种,STA是只能容纳一个线程的容器,MTA是能容纳多个线程的容器。COM规定,一个进程中可以有多个STA,但最多只能有一个MTA。线程调用CoInitializeEx(NULL,COINIT_APARTMENTTHREADED)后,这个线程就建立并且进入了一个STA,线程调用CoInitializeEx(NULL,COINIT_MULTITHREADED)后,这个线程就进入了进程公用MTA。一个线程不能同时进入两个Apartment。线程调用CoUninitialize()后,这个线程就退出了它所在的Apartment。设计COM对象时设定的“Apartment模型”就是指这个COM对象可以呆在那种Apartment中。一个线程建立的COM对象自动地呆在这个线程所在的Apartment中。要是这个线程建立了很多个COM对象,那这些对象都呆在这个线程所在的Apartment中。

一个线程可以直接访问它所在的Apartment中的COM对象,但要访问另一个Apartment中的COM对象就必须经过调度。因为STA中只有一个线程,别的线程要访问这个线程建立的COM对象就必须让这个线程代劳了,如此一来,对这个Apartment中所有的COM对象的访问都是序列化的,这些COM对象就不用担心有好几个线程同时访问它的麻烦事。MTA中的COM对象就没这么舒服了,它们必须考虑到可能会有好几个线程同时访问它们。MTA之外的一个线程访问MTA中的一个COM对象时,系统会从COM系统线程池中取出一个线程进入MTA,由它来代表客户线程访问这个COM对象。(COM系统线程池的机理是怎么样的?池中有几个线程?)

二、客户与服务器

COM对象位于服务器中,服务器分为进程内服务器、进程外服务器、远程服务器三种。进程内服务器是一个DLL文件,进程外服务器是一个EXE文件,远程服务器是另一台计算机上的一个DLL文件或EXE文件。远程服务器如果是一个DLL文件的话,由一个被称为“Surrogate”的代理程序调用它。

进程内服务器中的COM对象的Apartment模型如果与客户线程所在的Apartment相配合的话,客户线程建立COM对象时会直接建立在客户线程所在的Apartment中。比如Apartment模型与STA、Free模型与MTA,Both模型与STA或MTA。这样客户线程就可以直接调用COM对象而不用调度。否则就会专门建立一个线程,然后由这个线程建立COM对象,COM对象和客户线程就分处在两个Apartment中。进程外服务器和远程服务器中的COM对象一定不会建立在客户线程所在的Apartment中。对它们的调用一定要经过调度的。

三、在C++Builder下建立一个多Apartment的进程外服务器

由于不必考虑并行的问题,COM对象一般设成使用Apartment线程模型。进程内服务器还没什么问题,如果你试着建了一个进程外服务器,并且让几个客户同时访问服务器中的对象的话,就会发现这些访问不是同时进行的。如果有一个访问特别费时间,它后面的访问就要等很久才能进行。这是因为服务器中只有一个STA,虽然每个线程都建立了自己的COM对象,但这些对象都在这个STA中,当然无法并行执行。

克服这个问题的办法很简单,打开Borland\CBuilder5\Include\Atl\Atlmod.h文件,把第266行的:

typedef TATLModule TComModule;

改成:

#ifdef __DLL__

typedef TATLModule TComModule;

#else

typedef TATLModule > TComModule;

#endif

再打开Borland\CBuilder5\Include\Atl\Atlcom.h文件,把第3214行的:

DECLARE_CLASSFACTORY()

改成:

#ifdef __DLL__

DECLARE_CLASSFACTORY()

#else

DECLARE_CLASSFACTORY_AUTO_THREAD()

#endif
就可以了。重新编译你的程序,同时开两个客户试一试,是不是并发执行了?

先别高兴得太早,如果你同时开了五个客户,并且其中四个在执行费时的访问,你就会发现第五个客户的访问要等待一段时间。这种现象与C++Builder的实现代码有关。

作了前面的修改后,服务器启动后会预先生成几个线程,这些线程各自进入一个STA中。当服务器接到客户的访问要求后,会循环指定一个线程负责这个客户的建立COM对象、访问COM对象的事务。

比如第一个客户要求建立一个COM对象,服务器就给一号线程发消息,让这个线程建立一个COM对象并把这个COM对象的接口传给客户,以后第一个客户对这个COM对象的访问就全由一号线程代理。而第二个客户的建立COM对象、访问COM对象的事务就由服务器指定二号线程来办,如果客户太多,线程用完了,服务器又会让一号线程负责客户的要求,依次循环。如果客户很多,线程可能会负责几个客户的访问要求,而由同一个线程服务的客户的访问就会顺序执行。预先生成的线程数缺省为系统的CPU个数乘以四,也就是四个(除非你的机器有好几个CPU)。

只能同时服务四个客户当然是不行的,让我们继续修改。打开主CPP文件,可以看到下面两行代码:


[1] [2] 下一页 




上一篇:如何在C++Builder中检测硬件

下一篇:用Builder C++设计串行口COM1或COM2的读写操作

用C++Builder建立多线程COM服务器 相关文章:
·如何建立一个网站?规划、设计、目的、原则、宣传
·图文详解 Windows 2003服务器集群安装
·Dell PowerEdge 2950 服务器 Windows 2003安装手册
·自己电脑做smtp服务器不求人
·解决与HTTP 500 – 内部服务器错误错误信息有关的问题
·Linux各种服务器的架设
·Helix流媒体服务器架设及RMVB制作教程
·如何建立自己的博客
·何谓HTTP 500内部服务器错误
·自己电脑做SMTP服务器不求人
用C++Builder建立多线程COM服务器 相关软件:
·自己动手建立企业网站
·勤哲Excel服务器 2007 V7.1.4 完整企业版
·黑客视频教程-网吧代理服务器使用灰鸽子端口映射方法
·Windows 2000 高级服务器版
·腾讯企业QQ 服务器端 V 3.0.3
·多线程ping服务系统V1.2
·CS服务器插件AMX Mod X 1.76 中文版
·架设自己的QQ服务器
·asp.net服务器控件与组件开发
·入侵天堂服务器修改人物

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.viphot.com
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.viphot.com All Rights Reserved. 鄂ICP备05000083号Powered by:viphot