关于indy中httpserver控件的一个简单问题。(300分)

  • 主题发起人 主题发起人 www
  • 开始时间 开始时间
W

www

Unregistered / Unconfirmed
GUEST, unregistred user!
在下面这个事件中处理请求,
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
begin
ResponseInfo.ContentStream:=TMemorystream.create;
//用ContentStream来响应请求
...
....

end;

可是我在哪里释放ResponseInfo.ContentStream这个对象呢??
因为ResponseInfo.ContentStream是虚类TStream,所以我必须创建它的实例,可是我应该在
哪里释放它呢?
 
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
var
tempResponseinfo:Tmemorystream;
begin
tempResponseinfo:=TMemorystream.create;
try
。。。。。。对tempresponseinfo赋值

ResponseInfo.ContentStream:=tempResponseinfo;
finally
tempresponseinfo.free;
end;

...
....

end;
 
to 枫
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
var
tempResponseinfo:Tmemorystream;
begin
tempResponseinfo:=TMemorystream.create;
try
。。。。。。对tempresponseinfo赋值

ResponseInfo.ContentStream:=tempResponseinfo;
finally
tempresponseinfo.free;
end;

...
....
end.
因为没有responseinfo.contentstream没有 SendStream 方法,所以只有在这个过程结束后
contentstream中的内容才会被写到客户端,如果在这个过程结束之前调用
tempresponseinfo.free;的话,因为responseinfo.contentstream是一个指针,
tempresponseinfo被free掉了,ContentStream中还会有数据吗?你的办法我试过,不行。
不过还是谢谢你。

希望大家能帮我解决这个问题。

 
那这样的话,好像你这样做就行了
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
begin
ResponseInfo.ContentStream:=TMemorystream.create;
//用ContentStream来响应请求
...
....

end;

程序会自己帮你把tmemorystream释放了,不用自己释放,要不你自己做一下测试,看看内存是不是释放了。
 
可是这样会吃掉大量内存呀,ResponseInfo.ContentStream没有释放.....
 
我的意思是,在这个过程运行完后,程序会自动释放这个内存流,不用人工释放它

你测试过了吗?
 
在这个过程运行完后,程序[red][/red]会自动释放这个内存流.所以使用内存越来越多...
 
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
RequestInfo: TIdHTTPRequestInfo; ResponseInfo: TIdHTTPResponseInfo);
var
tempResponseinfo:Tmemorystream;
begin
tempResponseinfo:=TMemorystream.create;
try
。。。。。。对tempresponseinfo赋值

ResponseInfo.ContentStream:=tempResponseinfo;
ResponseInfo.WriteContent; <--你加上这一句,把内容传到客户端,然后再FREE掉内容流,你看看行不行
finally
tempresponseinfo.free;
end;

...
....

end;
 
接受答案了.
 
后退
顶部