Delphi/C++Builder Thread で TXMLDocument を使う

スレッド内で TXMLDocument は使えません。例外が発生します
Synchronize を利用して、メインスレッドで動かしてちょ。という事のようです。
  1. XMLDoc := TXMLDocument.Create(Application.MainForm);  
  2. try  
  3.  XMLDoc.LoadFromXML(AXmlData); // ←ココで例外発生  
  4.  XmlNode := XMLDoc.DocumentElement;  
  5.   
  6.  for I := 0 to XmlNode.ChildNodes.Count - 1 do begin  
  7.   // ...  
  8.  end;  
  9. finally  
  10.  XMLDoc.Free;  
  11. end;  
ということで無名メソッド(匿名メソッド)とSynchronizeで
  1. Synchronize(  
  2.  procedure()  
  3.  var I: Integer;  
  4.  begin  
  5.   XMLDoc := TXMLDocument.Create(Application.MainForm);  
  6.   try  
  7.       XMLDoc.LoadFromXML(AXmlData);  
  8.       XmlNode := XMLDoc.DocumentElement;  
  9.   
  10.       for I := 0 to XmlNode.ChildNodes.Count - 1 do begin  
  11.     // ...  
  12.    end;  
  13.   finally  
  14.    XMLDoc.Free;  
  15.   end;  
  16.  end);  
関数内の途中だけ、メインスレッドに持ってこれて、可視性も良いじゃん 変数も一部(for の I はローカル変数じゃないとNG)を除いて、そのまま使えるし~

コメント