![]() |
Verständnisproblem / Threadproblem ?
Hi,
der erste Codeabschnitt funktioniert ohne Probleme - nehme ich denselben Code aber in das onExecute auf - dann bricht delphi mit 'Exception der Klasse EOleSysFehler - CoInitialize wurde nicht aufgerufen aufgetreten' was ist den Coinitialize ? bzw. was muß ich tun um den code im 2ten codeabschnitt zu nutzen ? wo liegt das Problem ? Danke für die Hilfe so funktioniert der code
Delphi-Quellcode:
hier soll der code hin
procedure TForm1.Button1Click(Sender: TObject);
var dataobj: iordata; mysymbol: string; begin mysymbol:=cxtextedit1.text; dataobj := (ORSyncConnection1.Request(mysymbol) as iordata); processtransaction(dataobj); end;
Delphi-Quellcode:
procedure TForm1.tcpServerExecute(AContext: TIdContext);
var dataobj: iordata; mysymbol: string; begin mysymbol:=cxtextedit1.text; dataobj := (ORSyncConnection1.Request(mysymbol) as iordata); processtransaction(dataobj); end; |
Re: Verständnisproblem / Threadproblem ?
wenn du mit com objekte arbeitest muss in jedem thread coinit aufgerufen werden.
tu im constructor des thread coinit aufrufen und im destructor uninit. dann klappt das auch. |
Re: Verständnisproblem / Threadproblem ?
Hi,
gibts dazu irgendwo ein einfaches Bsp - ich muß gestehen ich hab im moment keine Ahnung wo und vor allem wie ich das machen kann... und das MSDN, Delphi Hilfe und Luckys Thread Tutorial bringen mich da einfach nicht weiter Tschö Ralf |
Re: Verständnisproblem / Threadproblem ?
Hi,
ich werde verrückt ich bekomme es einfach nicht gebacken wie oder wo ich das eintragen muß Zitat:
Jetzt hab ich mir das Buch 'COM/Dcom für Delphi zugelegt aber ich drehe mich einfach auf der Stelle hat den niemand einen codeschnipsel als Bsp :wall: :gruebel: Danke Ralf |
Re: Verständnisproblem / Threadproblem ?
eigendlich im source des threads ...
wenn du nicht mehr code postestes können wir dir die stelle nicht zeigen. aber irgendwo im code steht normalerweise:
Delphi-Quellcode:
und dazu schaust du dir die implementierung an und fügst das init ein.
tThreadTyp = class(tthread)
...bla... constuctor Create ..bla... end; |
Re: Verständnisproblem / Threadproblem ?
CoInitialize und CoUnInitialize müssen im Kontext des Threads aufgerufen werden.
Also sind der Konstruktor und Destruktor tabu, da diese im Kontext des Hauptthreads aufgerufen werden. Deshalb muss das innerhalb von [TThread].Execute stattfinden:
Delphi-Quellcode:
Jetzt muss man aber noch etwas aufpassen!!
procedure TCOMThread.Execute;
begin CoInitialize(nil); try // hier findet die eigentliche Arbeit statt finally CoUninitialize; end; end; Wenn ein Interface-Pointer noch "lebt", nachdem CoUninitialize aufgerufen wurde, dann liegt ein Fehler vor. Deshalb wird die "eigentliche Arbeit" ausgelagert:
Delphi-Quellcode:
procedure TCOMThread.InnerExecute;
var a,b, c : IUnknown; begin // hier findet die eigentliche Arbeit statt end; procedure TApartmentThread.Execute; begin CoInitialize(nil); try InnerExecute; finally CoUninitialize; end; end; |
Re: Verständnisproblem / Threadproblem ?
@Shmia
Hi, danke Dein Bsp. hat mir erst mal sehr weitergeholfen... ich war schon froh das ich die COM Schnittstelle normal zum laufen gekriegt hatte aber zusammen mit threads ist oft zum verzweifeln ... Danke Ralf P.S. danke natürlich auch an alle anderen die mir geholfen haben |
Re: Verständnisproblem / Threadproblem ?
Hallo,
noch ein Hinweis für die Theorie: Jeder Thread muss unter COM/DCOM sein eigenes Apartment anmelden. Das geschieht durch den Aufruf von CoInitialize und CoUnInitialize. |
Re: Verständnisproblem / Threadproblem ?
Hi,
ja das ist auch sehr schön in dem COM/DCOM Buch von Andreas Kosch beschrieben, aber wie mans praktisch Umsetzt - steht auf einem anderen Blatt... und am besten lerne ich halt aus kleinen CodeBsp und die sind in dem Bereich sehr rar Tschö Ralf |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22: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