AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ComObj und Thread

Ein Thema von EWeiss · begonnen am 22. Mai 2014 · letzter Beitrag vom 22. Mai 2014
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

ComObj und Thread

  Alt 22. Mai 2014, 08:16
ComObj in Verbindung mit Thread nicht Thread sicher?

CoInitialize und CoUniitialize verwende ich nicht.
Das Obj wird in einer anderen Classe initialisiert welche aber keine Thread Anbindung hat.
Ist also nur eine Hilfklasse.

Delphi-Quellcode:
    if CoCreateInstance(VisGUID, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER,
      IUnknown, ObjInstance) = S_OK then
Mit Thread laufen einige Plugins nicht ohne also mit Timer funktioniert es.

Habt ihr auch ähnliche Erfahrungen gemacht?

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: ComObj und Thread

  Alt 22. Mai 2014, 08:24
Das ist aber bekannt und aus dem Grund ruft man in einem Thread, der solche ComObj benutzt immer CoInitialize und CoUninitialize auf.

Prominentes Beispiel dafür sind die ADO-Komponenten.

Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  inherited;
  CoInitialize( nil );
  try
    DoExecute;
  finally
    CoUninitialize;
  end;
end;

procedure TMyThread.DoExecute;
begin
  while not Terminated do
  begin
    ...
  end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: ComObj und Thread

  Alt 22. Mai 2014, 08:49
Das ist aber bekannt und aus dem Grund ruft man in einem Thread, der solche ComObj benutzt immer CoInitialize und CoUninitialize auf.

Prominentes Beispiel dafür sind die ADO-Komponenten.

Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  inherited;
  CoInitialize( nil );
  try
    DoExecute;
  finally
    CoUninitialize;
  end;
end;

procedure TMyThread.DoExecute;
begin
  while not Terminated do
  begin
    ...
  end;
end;

Also doch..
Die Frage ist nur wo sollte man die Initialisierung aufrufen bzw Uninitialisieren.
Jedesmal wenn ich ein neues ComObj erstelle und wieder freigebe ?
Ein TMyThread.Execute gibt es ja bei mir nicht da ich den Thread mit Win32 mitteln erstelle siehe

Delphi-Quellcode:
WMPThreadHandle := BeginThread(nil, 0, @BassWMPVisThread, pointer(PresetIndex),
  0, WMP_RenderThreadId);
Mein RenderThread basiert auf TThread dieser hat aber nichts mit dem Hauptthread gemein.
Es sollte aber kein Problem diesbezüglich entstehen denn aus diesen Thread sende ich alle Messagen über Events.
Sample..
PostThreadMessage(DriveThreadId, FDataReadyMsg, DataReady, 0);
gruss

Geändert von EWeiss (22. Mai 2014 um 08:55 Uhr)
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#4

AW: ComObj und Thread

  Alt 22. Mai 2014, 08:54
Die Frage ist nur wo sollte man die Initialisierung aufrufen bzw Uninitialisieren.
Jedesmal wenn ich ein neues ComObj erstelle und wieder freigebe ?
Nein.
CoInitialize - jedesmal wenn Du eine neue Thread Instanz erstellst
CoUnInitialize - kurz bevor der Thread terminiert


PS:
Com muss in multithread Umgebungen auch entsprechend initialisiert werden ...
CoInitializeEx(nil, coinit_multithreaded)

Geändert von jensw_2000 (22. Mai 2014 um 08:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: ComObj und Thread

  Alt 22. Mai 2014, 08:55
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Zitat:
You need to initialize the COM library on a thread before you call any of the library functions except CoGetMalloc, to get a pointer to the standard allocator, and the memory allocation functions.
Zitat:
To close the COM library gracefully, each successful call to CoInitialize or CoInitializeEx, including those that return S_FALSE, must be balanced by a corresponding call to CoUninitialize.
Das bedeutet in meiner Lesart: vor der ersten Benutzung einer der enthaltenen Funktionen CoInitialize aufrufen und nach der Abarbeitung der letzten dann CoUninitialize.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: ComObj und Thread

  Alt 22. Mai 2014, 08:57
Die Frage ist nur wo sollte man die Initialisierung aufrufen bzw Uninitialisieren.
Jedesmal wenn ich ein neues ComObj erstelle und wieder freigebe ?
Nein.
CoInitialize - jedesmal wenn Du eine neue Thread Instanz erstellst
CoUnInitialize - kurz bevor der Thread terminiert
Vorher also vor BeginThread?
Oder direkt im Anschluss.

CoUnInitialize dann bevor ich ExitThread(0); abfeuere.

gruss
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#7

AW: ComObj und Thread

  Alt 22. Mai 2014, 09:02
Bevor der Thread gestartet wird (eine Chance hat auf die Com zuzugreifen).
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: ComObj und Thread

  Alt 22. Mai 2014, 09:16
So wie ich das verstanden habe muss das innerhalb des Thread-Kontext aufgerufen werden wo das ComObj dann auch benutzt wird.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: ComObj und Thread

  Alt 22. Mai 2014, 09:19
So wie ich das verstanden habe muss das innerhalb des Thread-Kontext aufgerufen werden wo das ComObj dann auch benutzt wird.
Ich hab es mal versucht aber es macht keinen Unterschied ob mit oder ohne.
Hmm wider mal so ein Problem.

Sollte nicht so einfach sein denn der Thread ist in einer DLL und wird von außen gesteuert.

Danke für eure Hilfe muss mich mal intensiver damit beschäftigen.

Der Thread wird ja in einer Funktion erstellt nicht zum aktuellen Thread-Kontext zählt.
Ist eine einfache Classe in der die API Messagen/Funktionen von der Anwendung zur DLL geschickt werden
Vielleicht muss ich die Execute Funktion dann in der Classe einlagern zu der mein Thread gehört.

Ist immer ein Kampf wenn das eine zum anderen nicht passt.

gruss

Geändert von EWeiss (22. Mai 2014 um 09:47 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: ComObj und Thread

  Alt 22. Mai 2014, 10:38
Hab gerade was gefunden in wie weit ist das Aussagekräftig?

Zitat:
On a different note, ComObj calls CoInitialize/Ex only for EXEs, not for DLLs. A DLL's lifetime and threading requirements is a subset of its host application. Therefore, it is the responsibility of the host application to initialize the COM runtime before calling into a DLL application. Explicitly calling CoInitialize/Ex in a DLL can result in unpredictable behavior and nasty runtime failures.
EDIT:
Ok das wars
Innerhalb der DLL hat das keinerlei Auswirkung.
Wenn ich hingegen die Initialisierung in der EXE ausführe bevor ich das Plugin starte funktioniert es.

gruss

Geändert von EWeiss (22. Mai 2014 um 10:49 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 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