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

スレッド内で TXMLDocument は使えません。例外が発生します
Synchronize を利用して、メインスレッドで動かしてちょ。という事のようです。
 XMLDoc := TXMLDocument.Create(Application.MainForm);
 try
  XMLDoc.LoadFromXML(AXmlData); // ←ココで例外発生
  XmlNode := XMLDoc.DocumentElement;

  for I := 0 to XmlNode.ChildNodes.Count - 1 do begin
   // ...
  end;
 finally
  XMLDoc.Free;
 end;
ということで無名メソッド(匿名メソッド)とSynchronizeで
 Synchronize(
  procedure()
  var I: Integer;
  begin
   XMLDoc := TXMLDocument.Create(Application.MainForm);
   try
       XMLDoc.LoadFromXML(AXmlData);
       XmlNode := XMLDoc.DocumentElement;

       for I := 0 to XmlNode.ChildNodes.Count - 1 do begin
     // ...
    end;
   finally
    XMLDoc.Free;
   end;
  end);
関数内の途中だけ、メインスレッドに持ってこれて、可視性も良いじゃん 変数も一部(for の I はローカル変数じゃないとNG)を除いて、そのまま使えるし~

コメント