indy的idTcpServer WriteBuffer 有内存泄露?

kylinn 2012-09-16 07:20:21
用的是indy的demo程序改的,idtcpserver在接到客户端消息后,再返回客户端这个消息,服务器的内存一直在增加。如果不返回消息那么内存不增加。 为什么?????

结构体:
TCCPacked = record
lenLow: Byte;
lenHigh: Byte;
OPR: Byte;
ERR: Byte;
CMD: Byte;
end;
服务端代码:
procedure TServerFrmMain.ServerExecute(AThread: TIdPeerThread);
var
TCCPACK :TCCpacked;
size: Integer;
dataarray: array of byte;
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
AThread.Connection.ReadBuffer (TCCPACK, SizeOf (TCCPacked));
size := makeword(tccpack.lenlow,tccpack.lenhigh);
setlength(dataarray,size-3); //获取长度
AThread.Connection.ReadBuffer (dataarray[0], size-3);

AThread.Connection.WriteBuffer (TCCPACK, SizeOf (TCCPacked), true); //注释掉这句话就不会内存泄露
end;
end;
客户端代码:
发送部分:
procedure TClientFrmMain.ButtonSendClick(Sender: TObject);
var
CommBlock : TCCpacked;
s : string;
sl : TstringList;
dataarray : array of byte;
i ,size: integer;
begin
CommBlock.OPR := $01;
CommBlock.ERR := $00;
CommBlock.CMD := strtoint(cbb_cmd.Text);

s := EditMessage.Text ;
sl := TstringList.Create;
Geteveryword(s,sl,' ');

setlength(dataarray,sl.Count);
for i := 0 to sl.Count -1 do begin
dataarray[i] := strtoint( sl.Strings[i]);
end;

size := sl.Count + 3;
sl.Free;
CommBlock.lenLow := Lo(size); // assign the data
CommBlock.lenHigh := Hi(size);
//先发送数据头
Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
//再发送Data部分
Client.WriteBuffer (dataarray[0] , length (dataarray), true);
// Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
end;
接收部分:
procedure TClientHandleThread.HandleInput;
begin
ClientFrmMain.mmo1.Lines.Add('Server Return: ' + inttostr(cb.ERR));
end;

procedure TClientHandleThread.Execute;
begin
while not Terminated do
begin
if not ClientFrmMain.Client.Connected then
Terminate
else
try
ClientFrmMain.Client.ReadBuffer(CB, SizeOf (CB));
Synchronize(HandleInput);
except
end;
end;
end;

解决重赏!!
...全文
309 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kylinn 2012-10-28
  • 打赏
  • 举报
回复
内存增大到一定程度就不增加了
kylinn 2012-10-28
  • 打赏
  • 举报
回复
经过测试 内存没有泄露,packed类型也是自动释放的- - 结贴
bdmh 2012-10-25
  • 打赏
  • 举报
回复
可以声明一个 TCCpacked的指针 ^ TCCpacked,new一个,然后传递,用完 dispose掉
wylton 2012-10-25
  • 打赏
  • 举报
回复
你把AThread.Connection.WriteBuffer (TCCPACK, SizeOf (TCCPacked), true); 中的TCCPACK转换成array of byte的变量.
孤独de猫 2012-10-25
  • 打赏
  • 举报
回复

record记录集,要改成PCCPacked = ^TCCPacked
var
ppack:PCCPacked ;
try
GetMem(ppack,Sizeof(TCCPacked ));
ReadBuffer(ppack,Sizeof(TCCPacked));
finally
FreeMem(ppack);
end;
wylton 2012-10-25
  • 打赏
  • 举报
回复
楼上也是种解决方法。

你的问题主要在于没搞懂record跟array of byte的区别。
虽然你的TCCPacked = record也是由byte组成的,但在实际应用上它是分节的,就像台阶那样堆叠的。而array of byte是一条直线平铺的。因此,你用TCCPACK直发,只能发送第一节台阶,剩余的哪里去?只能堆在你的记忆体中。
内容概要:本文系统性地介绍了基于“断线解环”思想的配电网辐射状拓扑约束建模方法,旨在通过Matlab代码实现,复现顶级EI论文中的核心技术。该方法聚焦于保障配电网在运行过程中维持严格的辐射状结构,防止环路形成,从而提高系统的安全性、稳定性和运行效率。文章深入阐述了如何利用混合整数线性规划(MILP)等优化技术处理复杂的拓扑约束条件,并结合标准配电网络进行仿真验证,特别适用于含分布式电源接入的现代复杂配电网。资源包不仅包含完整的Matlab实现代码,还整合了大量前沿科研方向的相关代码与资料,涵盖微电网优化调度、电动汽车协同管理、风光储联合系统、路径规划、深度学习预测等多个热门领域,并提供YALMIP等建模工具的支持,极大地方便了科研人员的学习、复现与二次开发。; 适合人群:具备电力系统、自动化、电气工程或相关工科专业背景,熟练掌握Matlab/Simulink仿真环境,正在从事电力系统优化、智能电网、分布式能源等领域科研或工程应用的人员,尤其适合研究生、博士生及具有一定科研基础的工程师。; 使用场景及目标:① 深入理解并掌握配电网辐射状拓扑约束的数学建模原理与“断线解环”策略的核心思想;② 成功复现高水平EI/SCI期刊论文中的优化模型与算法流程;③ 借助所提供的丰富案例代码,快速开展微电网经济调度、电动汽车优化、新能源预测、多目标优化等方向的科研项目;④ 熟练运用YALMIP等高级建模语言进行电力系统优化问题的建模、求解与分析。; 阅读建议:建议读者优先关注网盘中提供的完整代码、说明文档及示例数据,严格按照资源目录结构循序渐进地学习,重点剖析“断线解环”在消除环路、保证拓扑可行性方面的具体实现逻辑。务必亲自动手运行、调试和修改Matlab代码,以深化对理论模型与编程实现之间联系的理解。同时,可充分利用文中列举的其他研究主题作为灵感来源,拓展自身的科研视野与创新思路。

1,594

社区成员

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

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