Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   XML in Threads (https://www.delphipraxis.net/82702-xml-threads.html)

Luckie 18. Dez 2006 15:01


XML in Threads
 
Ich erstell ein XML-Dokument innerhalb eines Threads (TThread). Leider schlägt das Erstellen des DOMDokumentes fehl:
Delphi-Quellcode:
XMLDoc := CoDOMDocument.Create;
Ausserhalb eines Threads hat es wunderbar funktioniert. Muss ich noch irgwendwas beachten, initialisiern (Ich meine, da war mal was gewesen: :gruebel:) oder so?

sakura 18. Dez 2006 15:08

Re: XML in Threads
 
Ja, jeder Thread muss auf COM-Objekte vorbereitet werden. Für den Anwendungsthread macht Delphi das automatisch.
Delphi-Quellcode:
uses
  ActiveX;

constructor TMyThread.Create(Suspended: Boolean);
begin
  ...
  CoInitialize(nil); //evtl. mit "Ex" am Ende...
end;

destructor TMyThread.Destroy;
begin
  ...
  CoUninitialize;
  inherited;
end;
Wichtig: CoInitialize und CoUninitialize müssen gleich oft aufgerufen werden. Also evtl. alles in der Execute-Methode und ein try...finally drumrum, sonst gibt es im Programm später böse AVs oder anderes unerklärliches Verhalten.

...:cat:...

Luckie 18. Dez 2006 15:22

Re: XML in Threads
 
Hm. Ich habe es jetzt so:
Delphi-Quellcode:
constructor TSave.Create(Suspended: Boolean);
begin
  inherited Create(Suspended);
  CoInitialize(nil);
end;

destructor TSave.Destroy;
begin
  CoUninitialize;
  inherited;
end;
Aber das:
Delphi-Quellcode:
XMLDoc := CoDOMDocument.Create;
funktioniert immer noch nicht. XMLDoc ist immer noch nil. :?

Aufruf:
Delphi-Quellcode:
procedure TForm2.tbbSaveClick(Sender: TObject);
var
  Save             : TSave;
begin
  if SaveDialog1.Execute then
  begin
    Save := TSave.Create(True);
    try
      try
        Save.FreeOnTerminate;
        Save.Filename := SaveDialog1.FileName;
        Save.IEVect := ImageEnVect1;
        Save.OnProgress := Progress;
        Save.OnFinish := Finish;
        Save.Resume;
Update: Wenn es in der Execute Methode steht funktioniert es.

sakura 18. Dez 2006 15:30

Re: XML in Threads
 
Zitat:

Zitat von Luckie
Update: Wenn es in der Execute Methode steht funktioniert es.

Stimmt, :wall: Grund: das Objekt des Threads gehört dem aufrufenden Thread. Erst Execute wird in einem neuen Thread aufgerufen.

...:cat:...

P.S.: Nutze
Delphi-Quellcode:
XMLDoc := CoFreeThreadedDOMDocument.Create;
, damit Du das XML Objekt auch sicher ohne Critical Sections ausserhalb des erstellenden Threads nutzen kannst.

Luckie 18. Dez 2006 15:37

Re: XML in Threads
 
Danke für den Tipp. Das hat gleich noch einen Seiteneffekt behoben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz