delphi 从Indy9升级到Indy10时IdTcpServer的变化


本文整理自网络,侵删。

 
从Indy9升级到Indy10时IdTcpServer的变化
一、从Indy9升级到Indy10时IdTcpServer的变化        
试用了CodeGear2007后感觉挺好的,于是决定升级。别的都很顺利,就是程序中用到的控件Indy9.18要升级到Indy10.15,IdTcpServer变化的比较大。       
首先Indy9.18中的TcpServer在Indy10中被分割成了2个组件:TIdCmdTCPServer和TIdTCPServer。其中TIdCmdTCPServer是原来的TIdTCPServer,新的TIdTCPServer单独分出来了。如下图所示:         再者所以的原始的reads 和writes包括Read, ReadLn, Write, WriteLn等现在变成IOHandler的属性而不是TCPConnection的。按照官方的文档,这样做的原因一方面是为了将原始的I/O操作隔 离开来,另一方面是为了便于实现多态。变化如下图所示:        
第三就是控件中各事件的标识由“AThread: TIdPeerThread” 变成了“AContext: TIdContext”。在9种一个事件是在线程中执行的,每个连接都有单独的线程。而在10中则不同,同一个连接在不同的时候可能使用不同的线程。就是 把连接和线程分离了,这样能在连接过多的时候减少占用的资源和避免由线程切换带来的开销。连接信息的的存储位置也就不同,在9中存在AThread.Data里,在10中存在TIdContext.Data里。       
第四是 9中线程管理ThreadMgr变成了10中的调度管理Scheduler。这样既能像原来那样进行线程管理,也能对SuperCore中的调度纤程管理。       
上面就是在官方文档中描述的变化,还有SSL的变化,因为本例中没用到,就不说了。下面从代码上说说具体的变化。          
用CodeGear打开delphi的代码,会提示下列错误:         
“Error reading IdTcpServer1.CommandHandlers”       
“Error reading IdTcpServer1.Greeting.NumericCode”       
“Error reading IdTcpServer1.MaxConnectionReply.NumericCode”        “Error reading IdTcpServer1.ReplyExceptionCode"       
 “Error reading IdTcpServer1.ReplyTexts”       
"Error reading IdTcpServer1.ReplyUnknownCommand.NumericCode”       
“Error reading IdTcpServer1.ThreadMgr”         
"Class TIdThreadMgrPool not found"        
全部忽略,然后升级下列代码:       
1、将IdThreadMgrPool替换为IdSchedulerOfThreadPool1组件,并将IdTcpServer1的Scheduler属性改成IdSchedulerOfThreadPool1。       
2、将AThread : TIdPeerThread相关的全部代码改成AContext: TIdContext,并将Connection.下的相关I/O方法替换成Connection.IOHandler.的方法。       
3、 也是比较麻烦的,程序中需要定位每一个连接,在Indy9中是用AThread.ThreadID定位每一个连接的。因为9种连接和线程是一一对应 的,可以用线程ID定位连接。但在indy10种AContext:和线程不再对应,所以改为采用客户端发来的硬件序列号来确定,将序列号信息存在 AContext:.data中。因为程序中有许多部分都与此有关,所以修改起来挺麻烦的。
二、indy9 与 indy10的区别 作者:佚名 来源:转载 发布时间:2008-03-24 19:46:59

1.ReadBuffer

indy9: Athread.Connection.ReadBuffer()

indy10: tmpBytes : TIdBytes;

Athread.Connection.IOHandler.ReadBytes(tmpBytes, currRead); Buffer := PWord(@tmpBytes[0])^;

2.Synchronize

indy9: Athread.Synchronize();

改成indy10: uses idsync; //... procedure TfmMain.TCPServerExecute(AContext: TIdContext); begin Tidsync.SynchronizeMethod(IncrConnectioncount); //... end; procedure TfmMain.IncrConnectionCount; begin inc(FConnectionCount); end;

相关阅读 >>

Delphi spcomm串口控件的例程

Delphi 通过有道接口实现翻译

Delphi中如何控制webbrowser滚动条

Delphi 获取image.picture.data的数据

Delphi 转数字为大写金额源代码

Delphi 如何快速读取文本文件

winapi 字符及字符串函数(10): lstrcpy - 复制字符串

indy10下的tidhttp控件获取源码乱码的解决方法

Delphi 10.3.1新的变量的声明方法

Delphi 异或加解密

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...