X
xfeiffer
Unregistered / Unconfirmed
GUEST, unregistred user!
现在正在做一个东西,用TIdTCPServer来做的服务器,客户端很多,目前的思路是Server打开之后接纳每一个客户端发送的所有信息,然后将数据分包,再存入SQL Server数据库中,Server接收客户端的连接、断开、数据处理都是用的多线程来实现,现在的问题是所有的功能都能实现,但程序所占用的内存空间却直线上升,在我的线程声明里面已经把所有的Object都释放掉了,但为什么内存还在上升呢?请大家帮忙看一下
线程声明:
PMsgList=^TMsgList; //消息机制
TMsgList=record
Content:Array[0..9999]of Byte; //消息内容
Length:Integer; //消息长度
end;
TManageMessageThread=class(TThread)
private
myMessageMsgList; //这是一个传入的消息,也就是客户端发送的数据
myThread:TIdPeerThread;
myQuery:TADOQuery;
procedure HandleMessage;
..... //其他过程
public
constructor Create(AStyle:Boolean;AMessageMsgList;AThread:TIdPeerThread);overload;
destructor Destroy; override;
protected
procedure Execute; override;
end;
实现:
constructor TManageMessageThread.Create(AStyle:Boolean;AMessageMsgList;AThread:TIdPeerThread);
begin
inherited Create(AStyle);
EnterCriticalSection(CS); //创建线程时进入临界区
CoInitialize(nil);
FreeOnTerminate:=true;
myQuery:=TADOQuery.Create(nil);
myQuery.Close;
myQuery.Connection:=FormMain.ADOConn;
myMessage:=AMessage;
myThread:=AThread;
//FreeAndNil(Self);
end;
destructor TManageMessageThread.Destroy;
begin
myThread:=nil;
myThread.Free;
FreeMem(myMessage);
myQuery.Close;
myQuery:=nil;
myQuery.Free;
CoUnInitialize;
LeaveCriticalSection(CS); //执行完毕后退出临界区
inherited Destroy;
end;
procedure TManageMessageThread.Execute;
begin
try
Synchronize(HandleMessage);
finally
free;
end;
end;
procedure TManageMessageThread.HandleMessage;
begin
//处理数据,里面有涉及到数据库的查询和更新操作
end;
问题:
[red]现在的问题我觉得好像在数据库查询或更新之后的RecordSet数据集没有释放,但看了Delphi的帮助文档,里面说用Close就能关闭(我自己也测试过,用ADO从数据库中取了17万条数据之后测试程序占用的内存约50M,调用Close之后内存降到10M左右,测试程序初始化时占用的内存约4M左右),这说明能释放数据集所占用的空间,而且我也在线程中的每个涉及到数据库操作的过程的最后调用了Close来释放,为了保险在线程Destroy的时候也Close了,但实际上运行起来的时候内存没有释放(Server接收到数据之后如果不调用线程处理的话内存使用几乎没有变化,但如果调用线程处理了的话,内存占用就上升很快,这说明这个线程有问题),该如何来处理这个线程的释放问题呢?大家帮帮忙……高分相送:)[/red]
线程声明:
PMsgList=^TMsgList; //消息机制
TMsgList=record
Content:Array[0..9999]of Byte; //消息内容
Length:Integer; //消息长度
end;
TManageMessageThread=class(TThread)
private
myMessageMsgList; //这是一个传入的消息,也就是客户端发送的数据
myThread:TIdPeerThread;
myQuery:TADOQuery;
procedure HandleMessage;
..... //其他过程
public
constructor Create(AStyle:Boolean;AMessageMsgList;AThread:TIdPeerThread);overload;
destructor Destroy; override;
protected
procedure Execute; override;
end;
实现:
constructor TManageMessageThread.Create(AStyle:Boolean;AMessageMsgList;AThread:TIdPeerThread);
begin
inherited Create(AStyle);
EnterCriticalSection(CS); //创建线程时进入临界区
CoInitialize(nil);
FreeOnTerminate:=true;
myQuery:=TADOQuery.Create(nil);
myQuery.Close;
myQuery.Connection:=FormMain.ADOConn;
myMessage:=AMessage;
myThread:=AThread;
//FreeAndNil(Self);
end;
destructor TManageMessageThread.Destroy;
begin
myThread:=nil;
myThread.Free;
FreeMem(myMessage);
myQuery.Close;
myQuery:=nil;
myQuery.Free;
CoUnInitialize;
LeaveCriticalSection(CS); //执行完毕后退出临界区
inherited Destroy;
end;
procedure TManageMessageThread.Execute;
begin
try
Synchronize(HandleMessage);
finally
free;
end;
end;
procedure TManageMessageThread.HandleMessage;
begin
//处理数据,里面有涉及到数据库的查询和更新操作
end;
问题:
[red]现在的问题我觉得好像在数据库查询或更新之后的RecordSet数据集没有释放,但看了Delphi的帮助文档,里面说用Close就能关闭(我自己也测试过,用ADO从数据库中取了17万条数据之后测试程序占用的内存约50M,调用Close之后内存降到10M左右,测试程序初始化时占用的内存约4M左右),这说明能释放数据集所占用的空间,而且我也在线程中的每个涉及到数据库操作的过程的最后调用了Close来释放,为了保险在线程Destroy的时候也Close了,但实际上运行起来的时候内存没有释放(Server接收到数据之后如果不调用线程处理的话内存使用几乎没有变化,但如果调用线程处理了的话,内存占用就上升很快,这说明这个线程有问题),该如何来处理这个线程的释放问题呢?大家帮帮忙……高分相送:)[/red]