[Delphi] XMLDocument in threads

Pagina: 1
Acties:
  • 126 views sinds 30-01-2008
  • Reageer

  • SiHiDa
  • Registratie: December 2001
  • Laatst online: 01-03-2023
Ik gebruik een TXMLDocument in een thread, op de volgende manier:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TMyThread.Execute;
var
  XMLDocument2 : TXMLDocument;
begin
  CoInitialize(nil);
  try
    XMLDocument2 := TXMLDocument.Create(Application);
    XMLDocument2.FileName := 'c:\bgw.xml';
    XMLDocument2.Active := True;
    ShowMessage('Here');
  finally
    CoUninitialize;
  end;
end;

Probleem is echter dat 'Here' nooit tevoorschijn komt en dat als ik de application terminate, een Application Error tevoorschijn komt met de volgende text: '1400: Invalid window handle'. Vreemde is dat ik dit voorbeeldje rechtstreeks van internet heb gehaald, en dat het *daar* wel werkte. Btw, als ik een TXMLDocument dynamisch creeer, niet in een thread, maar 'gewoon', dan doet ie het wél. :?

Waar ligt dit aan?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Bij welke regel geeft ie die fout?

We adore chaos because we like to restore order - M.C. Escher


  • martijn_brinkers
  • Registratie: November 2001
  • Laatst online: 31-10-2025
probeer eens:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TMyThread.Execute;
var
  XMLDocument2 : TXMLDocument;
begin
  CoInitialize(nil);
  try
    XMLDocument2 := TXMLDocument.Create(Application) ;
    XMLDocument2.FileName := 'c:\bgw.xml';
    XMLDocument2.Active := True;
    MessageBox( 0, 'Here', '', 0 );    
  finally
    CoUninitialize;
  end;
end;


Volgens mij is dit weer het beruchte 'de VCL is niet thread safe syndroom'. ShowMessage is nl een VCL messagebox. Voor de 'non believers' zie:

http://groups.google.com/...km=3d5d84fe%40dnews#link1

En ook dit is niet op te lossen met een sleep ;-)

PS. Kan zijn dat
code:
1
XMLDocument2 := TXMLDocument.Create(Application) ;

ook niet safe is. Als dat niet safe is maak er dan van:

code:
1
XMLDocument2 := TXMLDocument.Create(Nil) ;


(vergeet niet XMLDocument2 dan zelf the free'en)

[ Voor 22% gewijzigd door martijn_brinkers op 14-03-2003 09:56 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

(vergeet niet XMLDocument2 dan zelf the free'en)
Let er wel op dat als je nil meegeeft aan de constructor van TXMLDocument dat het object gereference count wordt en dat je het dus in een interface (IXMLDocument) moet stoppen als je niet veel problemen wilt krijgen. Zelfs met Application zou ik m nog zelf vrijmaken, want het is zonde onnodig geheugen vast te houden. Maar dit is (nog) niet het probleem wat hier geschetst wordt.

We adore chaos because we like to restore order - M.C. Escher


  • SiHiDa
  • Registratie: December 2001
  • Laatst online: 01-03-2023
TijnFLiP schreef op 14 March 2003 @ 09:48:
probeer eens:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TMyThread.Execute;
var
  XMLDocument2 : TXMLDocument;
begin
  CoInitialize(nil);
  try
    XMLDocument2 := TXMLDocument.Create(Application) ;
    XMLDocument2.FileName := 'c:\bgw.xml';
    XMLDocument2.Active := True;
    MessageBox( 0, 'Here', '', 0 );    
  finally
    CoUninitialize;
  end;
end;


Volgens mij is dit weer het beruchte 'de VCL is niet thread safe syndroom'. ShowMessage is nl een VCL messagebox.
Dit was het idd. :) Tnx. :* Dat niet thread safe syndroom kende ik wel, ik wist echter niet dat dat ook voor ShowMessage gold.
LordLarry schreef op 14 March 2003 @ 10:21:
[...]


Let er wel op dat als je nil meegeeft aan de constructor van TXMLDocument dat het object gereference count wordt en dat je het dus in een interface (IXMLDocument) moet stoppen als je niet veel problemen wilt krijgen. Zelfs met Application zou ik m nog zelf vrijmaken, want het is zonde onnodig geheugen vast te houden. Maar dit is (nog) niet het probleem wat hier geschetst wordt.
Het was gewoon een voorbeeldje, daarom had ik andere factoren maar ff weggelaten. In de praktijk ga ik hem natuurlijk wel freeen. Ook dat IXMLDocument zal ik gaan gebruiken. Bedankt. :)

edit:

Btw: Die 1400 Invalid window handle kwam niet van de XMLDocument, maar van de popup die ik creerde... :X

[ Voor 7% gewijzigd door SiHiDa op 14-03-2003 12:39 . Reden: :X ]