请教TXMLDocument运用于多线程中奇怪的现象?

Mr Dang 2015-09-07 03:01:10


uses
Classes,SysUtils,Forms,IniFiles,ADODB,DB,XMLDoc,XMLIntf,SyncObjs,ExtCtrls,StdCtrls;

//Get data value from xml
function GetXMLData(Str_NodeName,Str_AttrName,Str_DataXML:string;Str_ParentNodeName:string=''):string;
var
XML_Doc:TXMLDocument;
XML_RootNode,XML_ParentNode,XML_DataNode:IXMLNode;
begin
Result:='';
if Str_DataXML='' then
begin
Exit;
end;

XML_Doc:=TXMLDocument.Create(Application);
try
XML_Doc.LoadFromXML(Str_DataXML);
XML_Doc.Active:=True;
XML_RootNode:=XML_Doc.DocumentElement;
if Str_ParentNodeName='' then
begin
//Find Node
XML_DataNode:=XML_RootNode.ChildNodes.FindNode(Str_NodeName);
if XML_DataNode=nil then
begin
Result:='';
Exit;
end;
end else
begin
//Find Parent Node
XML_ParentNode:=XML_RootNode.ChildNodes.FindNode(Str_ParentNodeName);
if XML_ParentNode=nil then
begin
Result:='';
Exit;
end;
//Find Node
XML_DataNode:=XML_ParentNode.ChildNodes.FindNode(Str_NodeName);
if XML_DataNode=nil then
begin
Result:='';
Exit;
end;
end;

if XML_DataNode.HasAttribute(Str_AttrName) then
begin
Result:=XML_DataNode.Attributes[Str_AttrName];
end else
begin
Result:=XML_DataNode.Text;
end;
finally
XML_Doc.Free;
end;
end;


问题描述:在DELPHI7中 16路甚至更多的线程频繁调用GetXMLData这个函数,经常报错,单步追踪到XML_Doc这个对象还没执行到XML_Doc.Free这里XML_Doc就变成nil了,实在想不明白为什么会这样子,弄了几天了头疼中...
...全文
173 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mr Dang 2015-09-07
  • 打赏
  • 举报
回复
感谢版主bdmh //以下是百度找到的答案,改了下应用于我自己的软件,稳定运行了,主要是: var XMLDoc:TXMLDocument; XMLNode: IXMLNode; child: IXMLNode; begin CoInitialize(nil); //初始化ActiveX XMLDoc:=TXMLDocument.Create(nil); XMLDoc.Active := true; XMLNode := XMLDoc.AddChild('ConsumeRec'); child := XMLNode.AddChild('EventsDateTime'); child.Text := dateTostr(Now); XMLDoc.SaveToFile('c:/ok.xml'); XMLDoc.Free; //不能用,因为接口自动释放内存。 CoUninitialize; end; 动态创建TXMLDocument对XML文件进行读取和写入 参考:http://overblue.blogbus.com/logs/13954596.html { 读取XML } var XML : TXMLDocument; Node1 : IXMLNode; DocIntf : IXMLDocument; begin XML := TXMLDocument.Create(nil); DocIntf := XML; //防止接口被自动释放,少了这一句会发生AV try XML.LoadFromStream(Strem); XML.Active := True; { 读ReportObject属性 } Node1 := XML.DocumentElement.ChildNodes.FindNode('ReportObjectProperty'); ReportName := Node1.ChildNodes.FindNode('ReportName').GetAttributeNS('Value', ''); ReportType := Node1.ChildNodes.FindNode('ReportType').GetAttributeNS('Value', ''); DataViewName := Node1.ChildNodes.FindNode('DataViewName').GetAttributeNS('Value', ''); SQLStr := Node1.ChildNodes.FindNode('SQLStr').GetAttributeNS('Value', ''); finally XML := nil; DocIntf := nil; end; end; 注意接口与对象的释放 TXMLDocument应用于多线程总结: 1、多线程中TXMLDocument.Create()括号里需要传递nil ,不能是Application,网上说的TXMLDocument创建都要传递Application是不对的,而在一般程序中我开始贴的代码GetXMLData是可以稳定运行的,或者使用GetXMLData在线程数量少的情况下出错的几率比较小。 2、多线程中写XML需要CoInitialize(nil); 最后 CoUninitialize; 3、多线程中读XML需要写上这个DocIntf := XML; //防止接口被自动释放,少了这一句会发生AV 搞了几天终于搞定,不容易 ~
bdmh 2015-09-07
  • 打赏
  • 举报
回复
List index out of bounds (7) 索引超出,还是调试一下吧,估计跟你多线程,又没有同步导致的,这边按10个元素处理,结构另一个线程已经把元素减少了,再访问就容易越界
Mr Dang 2015-09-07
  • 打赏
  • 举报
回复

EurekaLog 6.0.24

Exception:
----------------------------------------------------
  2.1 Date          : Mon, 7 Sep 2015 15:07:49 +0800
  2.2 Address       : 004208FE
  2.3 Module Name   : KMC.exe
  2.4 Module Version: 
  2.5 Type          : EListError
  2.6 Message       : List index out of bounds (7).
  2.7 ID            : 4221
  2.8 Count         : 1
  2.9 Status        : New
  2.10 Note         : 

Computer:
-----------------------------------------------------------------------
  5.1 Name          : 
  5.2 Total Memory  : 3414 Mb
  5.3 Free Memory   : 1743 Mb
  5.4 Total Disk    : 139.01 Gb
  5.5 Free Disk     : 100.23 Gb
  5.6 System Up Time: 3 hours, 56 minutes, 24 seconds
  5.7 Processor     : Intel(R) Pentium(R) CPU G645 @ 2.90GHz
  5.8 Display Mode  : 1600 x 900, 32 bit
  5.9 Display DPI   : 96
  5.10 Video Card   : Intel(R) HD Graphics Family (driver 6.14.10.5337)
  5.11 Printer      : EPSON ME 1100 Series (driver 1.54)

Operating System:
------------------------------------
  6.1 Type    : Microsoft Windows XP
  6.2 Build # : 2600
  6.3 Update  : Service Pack 3
  6.4 Language: Chinese
  6.5 Charset : 134

Assembler Information:
------------------------------------------------------
; Classes.TList.Delete (Line=0 - Offset=0)
; ----------------------------------------
004208E6  push    edi
004208E7  mov     esi, edx
004208E9  mov     ebx, eax
004208EB  test    esi, esi
004208ED  jl      Classes.TList.Delete
004208EF  cmp     esi, [ebx+$08]
004208F2  jl      Classes.TList.Delete
004208F4  mov     edx, [$564D1C]
004208FA  mov     ecx, esi
004208FC  mov     eax, [ebx]
004208FE  call    Classes.TList.Error  ; <-- EXCEPTION
00420903  mov     edx, esi
00420905  mov     eax, ebx
00420907  call    Classes.TList.Get
0042090C  mov     edi, eax
0042090E  dec     dword ptr [ebx+$08]
00420911  mov     eax, [ebx+$08]
00420914  cmp     esi, eax
00420916  jnl     Classes.TList.Delete
00420918  sub     eax, esi
0042091A  mov     ecx, eax

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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