Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Problem mit COM dll und Thread (https://www.delphipraxis.net/209683-problem-mit-com-dll-und-thread.html)

iphi 9. Jan 2022 06:51

Problem mit COM dll und Thread
 
Hallo,
ich habe ein Messgerät, welches über eine COM dll gesteuert wird.
Da die eine Messung initiierende Funktion blockiert, bis die Messung abgeschlossen ist, soll die in einem eigenene Thread ablaufen, um die GUI nicht zu blockieren.

Jetzt habe ich folgendes Problem:
- Die Measure-Funktion im Hauptthread aufgerufen läuft genau wie sie soll:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
pico.Measure('S11'); //geht
end;
- Die Measure-Funktion im Thread aufgerufen erzeugt eine Access Violation innerhalb der COM dll:

Delphi-Quellcode:
procedure MeasureThread.DoExecute;
begin
while not terminated do
  pico.Measure('S11'); //access violation in COM dll
end;


procedure MeasureThread.Execute;
begin
inherited;
CoInitialize( nil );
try
  DoExecute;
  finally
  CoUninitialize;
  end;
end;
Hat dafür jemand eine Erklärung?

TurboMagic 9. Jan 2022 08:56

AW: Problem mit COM dll und Thread
 
Hallo,

ich glaube eine COM-DLL muss für Multithreading Nutzung einen entsprechenden
Modus Deklarieren. Das müsste also der Anbieter tun.

Wenn das nicht hinzubekommen sein sollte, dann könnte man ein kleines Programm
Schreiben welches die DLL Benutzt und von deinem asynchron aufgerufen wird und
über einen Mechanismus (Named Pipe, TCP Verbindung im Local Host, Memory Mapped File...)
die Daten zurückliefert. Hätte man da einen bidirektionalen Mechanismus könnte deine
Anwendung dem Messprogrämmchen dann auch mitteilen, wann es beendet werden soll.

Die andere Frage ist aber auch: wie liefert diese COM-DLL die Daten zurück?
Gibt's da evtl. irgendwelche Callbacks die da dann bei dir aufgerufen werden und in
denen du mit deinem GUI interagierst? Das müsste dann ja auch Thread sicher passieren!

Grüße
TurboMagic

iphi 9. Jan 2022 16:33

AW: Problem mit COM dll und Thread
 
Zitat:

Das müsste also der Anbieter tun.
Da gibt es leider keinerlei Support. :-(

Danke für die Tipps!

peterbelow 10. Jan 2022 14:53

AW: Problem mit COM dll und Thread
 
Zitat:

Zitat von iphi (Beitrag 1500320)
Hallo,
ich habe ein Messgerät, welches über eine COM dll gesteuert wird.
Da die eine Messung initiierende Funktion blockiert, bis die Messung abgeschlossen ist, soll die in einem eigenene Thread ablaufen, um die GUI nicht zu blockieren.

Jetzt habe ich folgendes Problem:
- Die Measure-Funktion im Hauptthread aufgerufen läuft genau wie sie soll:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
pico.Measure('S11'); //geht
end;
- Die Measure-Funktion im Thread aufgerufen erzeugt eine Access Violation innerhalb der COM dll:

Delphi-Quellcode:
procedure MeasureThread.DoExecute;
begin
while not terminated do
  pico.Measure('S11'); //access violation in COM dll
end;


procedure MeasureThread.Execute;
begin
inherited;
CoInitialize( nil );
try
  DoExecute;
  finally
  CoUninitialize;
  end;
end;
Hat dafür jemand eine Erklärung?

Versuchs mal mit

Delphi-Quellcode:
CoInitializeEx(nil, COINIT_APARTMENTTHREADED);


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 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