日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

THttprio连接WebService的内存泄漏问题

發(fā)布時(shí)間:2025/3/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 THttprio连接WebService的内存泄漏问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

THttprio連接WebService的內(nèi)存泄漏問(wèn)題。

原來(lái)寫的一個(gè)通過(guò)Webservice讀取數(shù)據(jù)的程序,用Delphi7開(kāi)發(fā)的,在服務(wù)器上運(yùn)行一段時(shí)間就死掉了,測(cè)試后發(fā)現(xiàn)是內(nèi)存泄漏,在任務(wù)管理器中平均每次連接大概增長(zhǎng)幾十K內(nèi)存,長(zhǎng)時(shí)間運(yùn)行后CPU占用率很高,程序停止響應(yīng)。在國(guó)內(nèi)網(wǎng)站上搜索,關(guān)于Delphi連接Webservice的文章本來(lái)就很少,內(nèi)存泄漏相關(guān)的更少。不得已看了幾天鳥(niǎo)文,終于找到解決方法。
先說(shuō)一下我的webservice吧,連接到.Net2.0的webservice,返回一個(gè)Dataset。在網(wǎng)上可以找到很多如何用delphi返回.net Dataset的文章,大概就是xmlprovider讀取httprio返回的xml stream,再用clientdataset讀取xmlprovider的數(shù)據(jù),有兩個(gè)難點(diǎn),一個(gè)是必須用工具生成數(shù)據(jù)集格式文件*.xtr,本來(lái)xml有schemer描述,估計(jì)可能是delphi對(duì)xmlprovider還支持的不是很好,或者對(duì)中文支持不好,所以要自此生成格式文件.另外的難點(diǎn)是delphi默認(rèn)的soap格式(忘了是什么版本)是.net1.0,2.0的格式變了,所以直接用網(wǎng)上的帖子教的方式只能獲取到schemer,而沒(méi)有數(shù)據(jù),具體方法是webservice的wsdl描述文件中增加:
initialization
...
? InvRegistry.RegisterInvokeOptions(TypeInfo(MonitorServiceSoap),ioDocument);
這樣才能接收到數(shù)據(jù),另外httprio需要用UTF-8來(lái)傳送中文.
說(shuō)了這么多,其實(shí)當(dāng)初用了幾天時(shí)間學(xué)習(xí)怎么用delphi接收.net dataset,現(xiàn)在覺(jué)得是浪費(fèi)時(shí)間,自己編寫代碼解析xml其實(shí)是最快捷的方法,不過(guò)為了識(shí)別中文,必須把utf-8轉(zhuǎn)成ansistring:
? SetLength(s,SOAPResponse.size);
? SOAPResponse.Read(PChar(s)^,SOAPResponse.Size);
? s:=Utf8ToAnsi(s);
解析的代碼就不寫了.
很多e文帖子說(shuō)到是InvokeRegistry.pas中TInvokableClass在析構(gòu)函數(shù)中沒(méi)有釋放內(nèi)存造成,如下:
destructor TInvokableClass.Destroy;
begin
? FreeAndNil(FSOAPHeaders);
? inherited Destroy;
end;
其實(shí)是誤導(dǎo),因?yàn)檎{(diào)試的時(shí)候發(fā)現(xiàn)HttpRio根本沒(méi)有用到TInvokableClass類.
還有一個(gè)說(shuō)到是CreateXMLDocument(在XMLDoc.pas),出了問(wèn)題,Delphi創(chuàng)建XMLDocument按照從高到低的順序嘗試創(chuàng)建,首先創(chuàng)建xml4的版本,如果失敗再繼續(xù)建立低版本的,如果用戶機(jī)上沒(méi)有安裝msxml4.0,在創(chuàng)建失敗后會(huì)丟失內(nèi)存.作者對(duì)代碼做了一些修改,說(shuō)實(shí)話我也看不清楚為什么會(huì)造成泄漏,但是作者也提出只要安裝了msxml4.0就沒(méi)有問(wèn)題了,實(shí)際上我的機(jī)器上已經(jīng)安裝了,所以如果你懷疑的話可以追蹤進(jìn)入這個(gè)函數(shù)看看是不是第一次創(chuàng)建就成功了,來(lái)驗(yàn)證自己是否安裝了xml4.我不知道應(yīng)該如何檢索自己的xml版本,希望誰(shuí)知道的話回復(fù)一下.
繼續(xù)說(shuō)內(nèi)存泄漏的問(wèn)題,問(wèn)題在于調(diào)用webservice方法后返回了某個(gè)類型的類,這個(gè)類必須手動(dòng)卸載掉,如下
? mySoap:= GetMonitorServiceSoap(False,httpURL,HTTPRIO1);
? res:=mySoap.webserviceMethord(param);
? FreeAndNil(res);


附:delphi解析.net Dataset的講解文章:
http://community.borland.com/article/0,1410,28631,00.html

Google的論壇上也有很多直接在Google搜索不到的帖子,在俺差不多絕望的時(shí)候終于抓到救命稻草了,^_^
http://groups.google.com/?hl=zh-CN

?

總結(jié)

以上是生活随笔為你收集整理的THttprio连接WebService的内存泄漏问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。