• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

周六给公司做了个delphi技术培训,主要是中间层技术及多线程技术(2010-11-06) ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
 

 

 

一、            中间层各单元介绍

二、            中间层重要的类介绍

三、            帮大家分析一下RO是怎么工作的

四、            多核时代下的多线程编程----帮大家读懂TThread类(重点)

 

 

 

 

 

 

 

 

 

1、      中间层各单元介绍

单元名

作用

BestSQL.pas

 

BestConst.pas

 

BestDes.pas

 

BestFunc.pas

 

gunFunSys.pas

 

Ado_ConnectionPool.pas

连接池单元,主要用于客户端OpenData

BHServerLib_Intf.pas

中间层接口单元

BHServerLib_Invk.pas

中间层接口代理单元

BH_MSSQL_Service_Impl.pas

中间层接口实现单元

fServerForm.pas

主窗口

Provider.pas

 

Unit_Global.pas

列表对象池单元,用于客户端OpenList

 

 

 

 

 

 

 

 

 

 

 

 

 

2、      中间层重要的类介绍

类名

重要属性方法

Ado_ConnectionPool.pas单元:

TConnObject池内对象类

TConnectionPools池对象类

DoIncObjects方法---------增加池内部对象组成单向链表

GetInstance方法----------从池里取可用的对象

ReleaseInstance方法----将使用后的对象还原回池

 

ReleaseInstances方法----供检测线程调用,用于关闭长时间没有使用的TConnObject对象的数据库连接(TMSConnection

Unit_Global.pas单元:

TMyHashedStringList

1、  先解读IniFiles.pas单元下的THashedStringList

主要是看THashedStringList在修改删除时如何处理Hash

 

2TMyHashedStringListTHashedStringList的不足做了重要的调整,在大数据量的情况下性能提高很多

Unit_Global.pas单元:

TGroupObject池内对象类

TPoolGroupObject池对象类

IncObjects方法---------增加池内部对象组成双向链表

GetGroupObject方法----------从池里取可用的对象

ObjectsNoUseByStrObjectsSetCanUsed方法----将使用后的对象还原回池

 

CheckGroupObject方法----供检测线程调用,用于关闭长时间没有使用的TGroupObject对象

Unit_Global.pas单元:

TSafedStringList

中间层就是用这个类来存储用户列表的。

我们都知道Delphi 本向是有一个TStringList类的,但是我可以查看一下TStringList类的实现代码,我们会发现TStringList不是线程安全的。中间层的一个首要任务就是要处理多用户并发的情况也就是要处理好多线程的线程安全问题,因些才重新写了这个TSafedStringList 类。它的继承关系是:

TSafedStringList = class(TObject)

当然了,你也可以直接从TStringList类继承下来,再改写相应的方法即可。

 

 

3、      帮大家分析一下RO是怎么工作的

Server

 

1TROCustomSuperTcpServer.IntExecute 在其Create事件里有

        fIndyServer := TIdTCPServer.Create(nil);

        fIndyServer.OnExecute := IntExecute;

     IdCustomTCPServer.pas单元的TIdListenerThread.Run里调用

2TROSCServerWorker.DoExecute; 会一直循环直到Client端断开。当Client端有数据请求的时候会触发TROSCServerWorker.IncomingData事件

3TROSCServerWorker.IncomingData 会接着触发TROCustomSuperTcpServer.HasData 事件

4TROCustomSuperTcpServer.HasData 会执行TROInvokerQueueItem.Create 并将创建的对象执行 TROThreadPool.QueueItem

5TROThreadPool.QueueItem 执行后最终会由TROPooledThread来调用TROInvokerQueueItem.Callback

6、终于在TROInvokerQueueItem.Callback里调用又回到TROCustomSuperTcpServer.DispatchMessage其实是TROServer.DispatchMessage

 

重点参考下图的调用过程

 

 

7XXXX_Invk.pas单元定义的TXXXX_Invoker类是在MainProcessMessage单元里创建的。

function TROMessageDispatcher.ProcessMessage(const aTransport: IROTransport; aRequeststream, aResponsestream: TStream; out oResponseOptions: TROResponseOptions): boolean;

var

  lMessage: IROMessage;

begin

  lMessage := (MessageIntf as IROMessageCloneable).Clone();  //会创建一个TROBinMessage对象

  result := MainProcessMessage(lMessage, aTransport, aRequeststream, aResponsestream, oResponseOptions);

 

  //这里lMessage会被自动设置为 nil 从而Free了由(MessageIntf as IROMessageCloneable).Clone()创建的TROBinMessage对象

  //这说明 局部接口变量在过程或函数执行完后会被自动设置成 nil

end;

 

 

8MainProcessMessage函数里有代码来会用户的请求转为调用XXXX_Invk.pas里的相应的方法


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Matlab复习概要发布时间:2022-07-18
下一篇:
matlab批量更改文件夹下的图片格式发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap