Toon posts:

[BC++ 2006] thread xml-object

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik de hoofdapplicatie kan ik op de volgende manier een xmlobject aanmaken:
_di_IXMLDocument xmldoc = LoadXMLData((WideString)"<test/>");

wanneer ik dezelfde regel in een thread uitvoer krijg ik de volgende error.
Project Tconnect.exe raised exception class EOleExecption with message 'Coinitialize' is niet aangeroepen

Als ik dan afbreek wordt een scherm geopen in Builder waar ik kan browsen en staan de naam 'XMLDoc.pas' ingevuld

zowel in de hoofdapplicatie als in de thread worden de juiste includes gedaan.

op google gezocht, maar dit probleem lijkt redelijk uniek te zijn
ik gebruikt Borland C++ Studie 2006

[ Voor 19% gewijzigd door Verwijderd op 13-12-2006 15:50 ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Die melding komt waarschijnlijk van de IDE die je een regel wil laten zien uit dat bestand waar een exceptie gegooid wordt. De exceptie die gegooid wordt zal wel zijn dat je CoInitilizeEx nog niet hebt aangeroepen in je thread. Dat moet wel gebeuren en is een hele bekende fout. Tevens moet je dan aan het einde ook weer netjes CoUninitialize aanroepen. Zoek maar eens op threads en TXMLDocument en je zal genoeg meldingen vinden.

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


Verwijderd

Topicstarter
LordLarry schreef op woensdag 13 december 2006 @ 15:53:
Die melding komt waarschijnlijk van de IDE die je een regel wil laten zien uit dat bestand waar een exceptie gegooid wordt. De exceptie die gegooid wordt zal wel zijn dat je CoInitilizeEx nog niet hebt aangeroepen in je thread. Dat moet wel gebeuren en is een hele bekende fout. Tevens moet je dan aan het einde ook weer netjes CoUninitialize aanroepen. Zoek maar eens op threads en TXMLDocument en je zal genoeg meldingen vinden.
perfect, dat was de oplossing.
het zal wel komen doordat een windows-dll wordt aangesproken dat deze regel nodig is.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nee, het komt omdat TXMLDocument gebruik maakt van de XML DOM van MS welke via COM aangesproken wordt. COM vereist dat elke thread CoInitialize aanroept. De foutmelding was overigens ook erg duidelijk alleen je had even iets verder moeten kijken dan de eerste melding die de IDE je gaf :)

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


Verwijderd

Topicstarter
Wel heb ik nog een aanvullend probleem:
ik heb een functie gekoppeld aan een propertie van de thread.
voorbeeld:
orderThread *dbOrderThread = new orderThread(false);
dbOrderThread->OrderReceived = orderReceived;

Wanneer ik b.v. een id terug geef gaat het wel goed, maar als ik in de functie 'orderReceived' b.v. grafisch iets wil doen, b.v. nieuwe items op het scherm plaatsen of een panel leeg maken (panel->Free()) gaat het fout, er komt geen error, maar bij het afsluiten van de applicatie komt er wel een error.

Project Tconnect.exe raised exception class EIvalidPointer with message 'Invalid pointer operation'

Ik weet zeker dat ik geen NULL-object aanspreek, daar heb ik goed op gecontroleerd en geeft de debugger ook duidelij kweer. Het heeft weer iets met die thread te maken

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Is die orderReceived functie wel thread safe? Gebruik je bijvoorbeeld Synchronize? Zoniet, dan is dat de oorzaak. In dit geval zou ik adviseren om eerst eens de basis princiepes van threads door te nemen.

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


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 15:13
En stop je wel je thread bij het afsluiten van je applicatie? Wacht ook voor die thread effectief afgesloten is voor je de applicatie afsluit:

C++:
1
2
thread->Terminate ();
thread->WaitFor ();


Nog een opmerking: als je extra gegevens aan je thread meegeeft na creatie, start je de thread beter niet bij creatie:

C++:
1
2
3
orderThread *dbOrderThread = new orderThread(true);
dbOrderThread->OrderReceived = orderReceived;
dbOrderThread->Resume ();

Verwijderd

Topicstarter
LordLarry schreef op donderdag 14 december 2006 @ 11:45:
Is die orderReceived functie wel thread safe? Gebruik je bijvoorbeeld Synchronize? Zoniet, dan is dat de oorzaak. In dit geval zou ik adviseren om eerst eens de basis princiepes van threads door te nemen.
Hier had ik geen rekening mee gehouden.
Hierdoor kreeg ik rare dingen, zoals het verdwijnen van events.
Ik ga dit proberen en verwacht dat het probleem dan opgelost is

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ja, Synchronize lost vele problemen simpel op. Helaas wordt je thread dan wel minder efficient, omdat het op dat punt synchroon moet gaan lopen met de main UI thread. Er zijn ook nog andere oplossingen die in sommige gevallen efficienter werken. Ik wil je adviseren om meer over threading te gaan lezen.

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

Pagina: 1