![]() |
ComObj und Thread
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:
Mit Thread laufen einige Plugins nicht ohne also mit Timer funktioniert es.
if CoCreateInstance(VisGUID, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER,
IUnknown, ObjInstance) = S_OK then Habt ihr auch ähnliche Erfahrungen gemacht? gruss |
AW: ComObj und Thread
Das ist aber bekannt und aus dem Grund ruft man in einem Thread, der solche ComObj benutzt immer
Delphi-Quellcode:
und
CoInitialize
Delphi-Quellcode:
auf.
CoUninitialize
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; |
AW: ComObj und Thread
Zitat:
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:
Mein RenderThread basiert auf TThread dieser hat aber nichts mit dem Hauptthread gemein.
WMPThreadHandle := BeginThread(nil, 0, @BassWMPVisThread, pointer(PresetIndex),
0, WMP_RenderThreadId); Es sollte aber kein Problem diesbezüglich entstehen denn aus diesen Thread sende ich alle Messagen über Events. Sample..
Delphi-Quellcode:
PostThreadMessage(DriveThreadId, FDataReadyMsg, DataReady, 0);
gruss |
AW: ComObj und Thread
Zitat:
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 ...
Delphi-Quellcode:
CoInitializeEx(nil, coinit_multithreaded)
|
AW: ComObj und Thread
![]() Zitat:
Zitat:
|
AW: ComObj und Thread
Zitat:
Oder direkt im Anschluss. CoUnInitialize dann bevor ich ExitThread(0); abfeuere. gruss |
AW: ComObj und Thread
Bevor der Thread gestartet wird (eine Chance hat auf die Com zuzugreifen).
|
AW: ComObj und Thread
So wie ich das verstanden habe muss das innerhalb des Thread-Kontext aufgerufen werden wo das ComObj dann auch benutzt wird.
|
AW: ComObj und Thread
Zitat:
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 |
AW: ComObj und Thread
Hab gerade was gefunden in wie weit ist das Aussagekräftig?
Zitat:
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 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