![]() |
COM-Objekte (TOleServer) in Thread-Kontext benutzten
Hallo DPler,
mal wieder ein Problem bei dem ich nicht die richtigen Suchbegriffe zu finden scheine. Die Vorraussetzung Ein COM-Object sorgt für die Kommunikation zwischen einem USB-Device und der Software. Im Onlinemodus überträgt der Device an uns Daten mit ca. 5 Hz. Wir erhalten eine Methode ausgelößt OnData die uns darüber informiert, dass es wieder mal soweit ist, Daten zu lesen. Das Problem Ist der Main-Thread (Application) gerade mit anderen Dingen beschäftigt, bekommen wir die Daten nicht mehr. Dies tritt zwar erst ein, wenn wir länger als eine Sekunde nicht reagieren können, nichts desto trotz möchten wir diese Zeitspanne gerne erhöhen. Problemlösungs-Ansatz Threads :mrgreen: Die Allerweltslösung ist die Parallelität. Daher möchte ich gerne den COM-Server im Thread-Kontext laufen lassen. Nur wie stelle ich das an? Soweit ich gesehen habe werden unsere Events (darunter OnData) in InvokeEvent des OleServers ausgelöst. Also: 1. Wie erstelle ich eine MessageLoop in einem Thread die ich dann einem OleServer "übergeben kann" 2. Wie übergebe bzw. sage ich dem COM-Server welche MessageLoop er verwenden soll / im welchem Kontext er läuft. Oder geht sowas gar nicht? THX, Chris |
Re: COM-Objekte (TOleServer) in Thread-Kontext benutzten
Ich vermute mal, dass der Server ein Single Thread Apartment erfordert. Wie liefert er denn das Ereignis aus?
|
Re: COM-Objekte (TOleServer) in Thread-Kontext benutzten
Hallo Apollonius,
zunächst mal danke für Deine Antwort. Aber ich muss gestehen, ich stehe mit COM-Servern noch ziemlich am Anfang bzw. verwende ich die Dinger einfach nur ohne mir all zu viel Gedanken darüber zu machen. D.h. Dein Stichwort ![]() In der entsprechenden Klasse die von TOleServer abgeleitet ist, sehe ich nur folgendes bezüglich des Events:
Delphi-Quellcode:
Meine Vermutung war jetzt die, das der COM-Server intern die Nachricht in eine MessageLoop gibt und InvokeEvent darauf reagiert. Denn wenn InvokeEvent im Kontext des Threads laufen würde, hätte ich die Probleme nicht :-)
procedure TMeineKlasse.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
begin case DispID of -1: Exit; // DISPID_UNKNOWN 1: if Assigned(FOnDataIn) then FOnDataIn(Self, Params[0] {const IDispatch}); // hier natürlich noch weitere Fälle end; {case DispID} end; Ich nutzte das Objekt wie folgt:
Delphi-Quellcode:
Reicht es tatsächlich so ein
MeineKlasse := TMeineKlasse.Create(AOwner);
//... MeineKlasse.OnDataIn := MeineKlasseDataIn; //... ![]() ![]() THX, Chris |
Re: COM-Objekte (TOleServer) in Thread-Kontext benutzten
Also,
vielen Dank nochmal.
Delphi-Quellcode:
Das hat die Lösung gebracht. Das "Problem" ist nur, dass jetzt alle aufrufe wohl im Thread-Kontext sind :mrgreen:
initialization
CoInitializeEx(nil, COINIT_MULTITHREADED); // Neu für Multithreading finalization CoUninitialize; Ich wollte es eigentlich explizit steuern/auswählen können. Doch dass mach ich jetzt im Nachhinein. Somit gelöst |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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