AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi COM-Objekte (TOleServer) in Thread-Kontext benutzten

COM-Objekte (TOleServer) in Thread-Kontext benutzten

Ein Thema von ChrisE · begonnen am 7. Sep 2009 · letzter Beitrag vom 8. Sep 2009
Antwort Antwort
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

COM-Objekte (TOleServer) in Thread-Kontext benutzten

  Alt 7. Sep 2009, 13:02
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
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
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: COM-Objekte (TOleServer) in Thread-Kontext benutzten

  Alt 7. Sep 2009, 17:24
Ich vermute mal, dass der Server ein Single Thread Apartment erfordert. Wie liefert er denn das Ereignis aus?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: COM-Objekte (TOleServer) in Thread-Kontext benutzten

  Alt 8. Sep 2009, 07:36
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 MSDN-Library durchsuchenSingle-Threaded Apartments geht wahrscheinlich schon in die Richtung. Der Hersteller des COM-Servers sagt, dass intern ein Worker-Thread arbeitet der die Events auslöst, dass neue Daten da wären.
In der entsprechenden Klasse die von TOleServer abgeleitet ist, sehe ich nur folgendes bezüglich des Events:
Delphi-Quellcode:
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;
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

Ich nutzte das Objekt wie folgt:
Delphi-Quellcode:
MeineKlasse := TMeineKlasse.Create(AOwner);
//...
MeineKlasse.OnDataIn := MeineKlasseDataIn;
//...
Reicht es tatsächlich so ein MSDN-Library durchsuchenCoInitializeEx mit MSDN-Library durchsuchenCOINIT_MULTITHREADED aufzurufen? Nur woher weiß der TOleServer dann an welche MessageLoop er senden soll. Ich will einfach nur sicher gehen, dass der Mainthread für ein Paar Sekunden voll ausgelastet sein kann aber die Daten übertragen Device->Software weiter läuft.

THX, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: COM-Objekte (TOleServer) in Thread-Kontext benutzten

  Alt 8. Sep 2009, 08:43
Also,

vielen Dank nochmal.

Delphi-Quellcode:
initialization
  CoInitializeEx(nil, COINIT_MULTITHREADED); // Neu für Multithreading
finalization
  CoUninitialize;
Das hat die Lösung gebracht. Das "Problem" ist nur, dass jetzt alle aufrufe wohl im Thread-Kontext sind
Ich wollte es eigentlich explizit steuern/auswählen können. Doch dass mach ich jetzt im Nachhinein.

Somit gelöst
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 18:37 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