关于在访问WEB SERVICE时内存泄露的问题

gengxuyong 2003-12-16 01:19:19
我在客户端的代码如下,调用WEB SERVICE一端的时候,WEB SERVICE返回一个数值
CoInitialize(nil);
try
HTTPRIO1.URL := 'http://localhost/scripts/package.dll/soap';
packobj := HTTPRIO1 as Ipackage;
packobj.packdata(par1);
finally
CoUninitialize;
packobj := nil;
end;
这段代码我放在了一个客户端的一个定时器下让它500毫秒访问一次WEB SERVICE端,但是这样内存的使用会不断增长
...全文
94 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
gengxuyong 2003-12-18
  • 打赏
  • 举报
回复
高手都在那儿呢,怎么都不来了啊
bluz 2003-12-17
  • 打赏
  • 举报
回复
确定是这段代码的问题吗?有没有单步跟踪过?
gengxuyong 2003-12-17
  • 打赏
  • 举报
回复
刚才我也把HTTPRIO1.URL指定到了接口,试了一段时间但是,内存还是在不断的增长。
另外总是很频繁的出现,“文档的顶层无效“的错误。怎么办呢?

客户端完整代码:
var
scanobj: Iscanws;
cc: integer;
begin
CoInitialize(nil);
try
HTTPRIO1.URL := 'http://localhost/scripts/scanwebservice.dll/soap';
scanobj := HTTPRIO1 as Iscanws;
cc := scanobj.scan(2);
ListBox1.Items.Clear;
ListBox1.Items.Add(inttostr(cc));
finally
CoUninitialize;
scanobj := nil;
end;

服务端的完整代码:
function Tscanws.scan(port: integer): integer;
begin
result := port;
end;
此函数为服务端的接口函数
另外上述的客户端代码是放在了一个定时器下边的,HTTPRIO1也是静态的放到FORM上的控件

请各位帮忙找一下问题!
gengxuyong 2003-12-17
  • 打赏
  • 举报
回复
但是,为什么在服务端会发生这个错误呢?
而且 ,我曾写了一个在服务端只返回一个数值的程序,但有的时候还是会出现这个错误,这是怎么会事呢?
猛禽 2003-12-17
  • 打赏
  • 举报
回复
这个一般是因为服务端出错,返回了HTML页面所致,因为SOAP只认XML,碰到HTML就出这个错
gengxuyong 2003-12-17
  • 打赏
  • 举报
回复
好的先试一下,但愿会没事吧,一会儿我再把结果贴上来。另外总是会弹出
“文档的顶层无效的错误”,这个错误是由什么原因引起的呢?
猛禽 2003-12-17
  • 打赏
  • 举报
回复
楼上的说的有理,你改为指定到接口试试
bluz 2003-12-17
  • 打赏
  • 举报
回复
我调用的方法和你一样的,只不过我是指定到接口
HTTPRIO1.URL := 'http://localhost/scripts/package.dll/soap/IMyService';
gengxuyong 2003-12-17
  • 打赏
  • 举报
回复
可是我的程序就不行了啊,我在晚上下班的时候把程序打开开始运行然后第二天一看,内存溢出,应用程序终止。不知楼上的朋友是如何调用WEB SERVICE端的呢?
gengxuyong 2003-12-17
  • 打赏
  • 举报
回复
希望各位能够多多支援啊!在线等待,望各位指点迷津啊!
bluz 2003-12-17
  • 打赏
  • 举报
回复
有空帮你试试
gengxuyong 2003-12-17
  • 打赏
  • 举报
回复
我的这个测试程序只有这么多的代码,别的什么东西都没有啊!你可以放到你的机器上试一下
bluz 2003-12-16
  • 打赏
  • 举报
回复
gengxuyong兄,刚才我让你吓了一跳,我有一个程序也是循环调用一个webservice,我看了你的贴,测了一下,发现从8m一路涨,吓死了,后来发现到25m左右又会减少到10m,如此往复。

真是好险
gengxuyong 2003-12-16
  • 打赏
  • 举报
回复
但是还是不行啊,内存还是在长,怎么办呢?
gengxuyong 2003-12-16
  • 打赏
  • 举报
回复
谢谢楼上的朋友,因为CoInitialize/CoUninitialize是对COM的初始化和反初始化吧
bluz 2003-12-16
  • 打赏
  • 举报
回复
你肯定是在implement下面use接口单元了。

请教一下Raptor,为什么线程要用CoInitialize/CoUninitialize?
猛禽 2003-12-16
  • 打赏
  • 举报
回复
把implementation里的uses里的接口单元放到inerface里的uses中去就不会有这个错了
gengxuyong 2003-12-16
  • 打赏
  • 举报
回复
但是packobj放不到FORM类中啊,我在按钮下是这样声明的:var scanobj: Iscanws;
Iscanws为WEB SERVICE的接口,但是我在把它添加到FORM成员时会出现错误:Undeclared identifier: 'Iscanws'。找不到'Iscanws'此接口,这该怎么办呢?
猛禽 2003-12-16
  • 打赏
  • 举报
回复
定时器不是线程,一般来说,不用CoInitialize/CoUninitialize
这句也可以放到FORM 的ONCREATE或ONSHOW里去
HTTPRIO1.URL := 'http://localhost/scripts/package.dll/soap';
把PACKOBJ放到FORM中作为一个成员,这样下面这句也可以在FORM ONCREATE等里执行一次即可
packobj := HTTPRIO1 as Ipackage;
这样在定时器中只要执行这一句即可,这样再试试看还有没有
packobj.packdata(par1);
gengxuyong 2003-12-16
  • 打赏
  • 举报
回复
是客户端发生的内存泄露
加载更多回复(1)

1,593

社区成员

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

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