Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verständnisproblem / Threadproblem ? (https://www.delphipraxis.net/58768-verstaendnisproblem-threadproblem.html)

th_bone 12. Dez 2005 13:30


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:
procedure TForm1.Button1Click(Sender: TObject);
var
  dataobj: iordata;
  mysymbol: string;
begin
  mysymbol:=cxtextedit1.text;
  dataobj := (ORSyncConnection1.Request(mysymbol) as iordata);
  processtransaction(dataobj);
end;
hier soll der code hin
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;

generic 12. Dez 2005 14:34

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.

th_bone 12. Dez 2005 15:36

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

th_bone 19. Dez 2005 18:22

Re: Verständnisproblem / Threadproblem ?
 
Hi,

ich werde verrückt ich bekomme es einfach nicht gebacken wie oder wo ich
das eintragen muß

Zitat:

wenn du mit com objekte arbeitest muss in jedem thread coinit aufgerufen werden.
tu im constructor des thread coinit aufrufen und im destructor uninit.
wo finde ich den den constructor bzw. destructor zu diesem thread ?

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

generic 20. Dez 2005 00:41

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:
tThreadTyp = class(tthread)
 ...bla...

  constuctor Create ..bla...
end;
und dazu schaust du dir die implementierung an und fügst das init ein.

shmia 20. Dez 2005 08:55

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:
procedure TCOMThread.Execute;
begin
   CoInitialize(nil);
   try
      // hier findet die eigentliche Arbeit statt

   finally
      CoUninitialize;
   end;
end;
Jetzt muss man aber noch etwas aufpassen!!
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;

th_bone 20. Dez 2005 17:04

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

Jens Schumann 20. Dez 2005 17:22

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.

th_bone 20. Dez 2005 17:58

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 06:44 Uhr.

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