Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Create(TComponent) innerhalb eines TThreads aufrufen (https://www.delphipraxis.net/209334-create-tcomponent-innerhalb-eines-tthreads-aufrufen.html)

MorrisF 23. Nov 2021 17:33

Create(TComponent) innerhalb eines TThreads aufrufen
 
Hallo liebes Delphi-PRAXIS-Forum,
ich habe ein Problem mit Threads...
Habe mir eine SIP-Telefon-Klasse geschrieben, welche mit verknüpften Events/Methoden arbeitet
Delphi-Quellcode:
SIP_Client := TSIPclient.Create(aOwner);
SIP_Client.OnRegistration := OnRegistration;
SIP_Client.OnCall := OnCall;
SIP_Client.OnAnswer := OnAnswer;
SIP_Client.OnBye := OnHangup;
die Methoden habe ich innerhalb meiner Telefon-Klasse dann neu definiert.
Die Events werden immer bei der entsprechenden Aktion ausgelöst. (z.B.: Wenn man auflegt, wird OnHangup() ausgelöst usw...)
Wenn ich meine Telefon-Klasse aufrufen will funktioniert das im Regelfall so:
Delphi-Quellcode:
Telefon := TTelefon.Create(Self, Server, User, Pass);
Dabei ist
Delphi-Quellcode:
aOwner
(vom Typ
Delphi-Quellcode:
TComponent
) mein
Delphi-Quellcode:
Self
, dass ich im Konstruktor von
Delphi-Quellcode:
TTelefon
mit gebe.
Funktioniert super in "normalen" Klassen.
Jetzt wollte ich mein Telefon innerhalb eines
Delphi-Quellcode:
TThread
Createn aber wenn ich
Delphi-Quellcode:
Telefon := TTelefon.Create(TComponent(Form_Main), Server, User, Pass);
(Mit
Delphi-Quellcode:
.Create(TComponent(Self), ...)
gehts auch nicht) mache, dann werden die verknüpften Events nicht ausgelöst. Weiß jemand warum?
In Form_Main hat es wieder funktioniert. Nur nicht aus dem Thread heraus.
Würde mich freuen, wenn jemand eine Lösung für mein Problem wissen würde! :-D

KodeZwerg 24. Nov 2021 07:19

AW: Create(TComponent) innerhalb eines TThreads aufrufen
 
Eine mögliche Erklärung wäre, im Hauptthread arbeitet eine Schleife die alles abarbeitet (WindProc / TMessage) die auf deine Events reagieren kann.
Dein Thread steht au0erhalb und hat nur das zur Verfügung was du ihm mitgibst.

MorrisF 24. Nov 2021 08:02

AW: Create(TComponent) innerhalb eines TThreads aufrufen
 
Oke also muss ich meinem Thread quasi Form_Main mitgeben?

Bernhard Geyer 24. Nov 2021 08:17

AW: Create(TComponent) innerhalb eines TThreads aufrufen
 
Zitat:

Zitat von MorrisF (Beitrag 1498075)
Oke also muss ich meinem Thread quasi Form_Main mitgeben?

Nein. Form_Main ist im Haupt-Thread der Anwendung erstellt.

Du darfst von deinem Thread Richtung Hauptformular nur mit Synchronize arbeiten.
Alle Windows-Handles sind nur im Thread gültig, in dem sie erzeugt werden.
Und wenn du mit dem Haupformular in deinem Thread arbeitest, greifst du indirekt auf die mit dem Formular verbundene Windows-Handles zu.

KodeZwerg 24. Nov 2021 09:24

AW: Create(TComponent) innerhalb eines TThreads aufrufen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1498073)
Eine mögliche Erklärung wäre, im Hauptthread arbeitet eine Schleife die alles abarbeitet (WindProc / TMessage) die auf deine Events reagieren kann.
Dein Thread steht au0erhalb und hat nur das zur Verfügung was du ihm mitgibst.
Zitat:

Zitat von MorrisF (Beitrag 1498075)
Oke also muss ich meinem Thread quasi Form_Main mitgeben?


Nein. Ich schrieb doch was fehlt, eine WndProc-Schleife :-D

MorrisF 25. Nov 2021 09:49

AW: Create(TComponent) innerhalb eines TThreads aufrufen
 
Ich weiß leider nicht, was eine WndProc-Schleife ist... habe auch null Erfahrung damit...
Könnt ihr mir ein Beispiel geben?

MorrisF 25. Nov 2021 10:31

AW: Create(TComponent) innerhalb eines TThreads aufrufen
 
Also so funktioniert es:
Delphi-Quellcode:
Synchronize(Self,
        procedure
        begin
          Telefon := TTelefon.Create(Form_Main, Server, User, Password);
        end
      );
      Telefon.BeimAbnehmen := TelefonBeimAbnehmen;
      Telefon.BeimAnrufAnnehmen := TelefonBeimAnruf;
      Telefon.BeimAuflegen := TelefonBeimAuflegen;
      Telefon.BeiFehler := TelefonBeiFehler;
Ist das richtig/schön so? oder kann man da noch was dran feilen?

himitsu 25. Nov 2021 10:34

AW: Create(TComponent) innerhalb eines TThreads aufrufen
 
VCL-Komponenten selber, also welche an globalen Dingen wie Application, DefaultFont und Co. hängen, müssen immer immer Hauptthread erstellt werden.

Komponenten ohne globale Verknüpfungen, aber z.B. mit einem HWND müssen in dem Thread erstellt werden, wo sie verwendet werden.
Und man muß dort dann auch selber die Messages verarbeiten, also MessageLoop im Thread, da die VCL nur den Hauptthread betreibt.

KodeZwerg 25. Nov 2021 12:56

AW: Create(TComponent) innerhalb eines TThreads aufrufen
 
MSDN-Library durchsuchenCreateEvent / MSDN-Library durchsuchenSetEvent / MSDN-Library durchsuchenWaitForSingleObject - über solche dinge würde ich im Thread an die Sache rangehen.
Über Pipes sollte es auch möglich sein.
Es gibt wie immer viele Möglichkeiten die zum Ziel führen ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:52 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 by Thomas Breitkreuz