AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Create(TComponent) innerhalb eines TThreads aufrufen
Thema durchsuchen
Ansicht
Themen-Optionen

Create(TComponent) innerhalb eines TThreads aufrufen

Ein Thema von MorrisF · begonnen am 23. Nov 2021 · letzter Beitrag vom 25. Nov 2021
Antwort Antwort
MorrisF

Registriert seit: 3. Apr 2019
41 Beiträge
 
#1

Create(TComponent) innerhalb eines TThreads aufrufen

  Alt 23. Nov 2021, 17:33
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:
Telefon := TTelefon.Create(Self, Server, User, Pass); Dabei ist aOwner (vom Typ TComponent ) mein Self , dass ich im Konstruktor von TTelefon mit gebe.
Funktioniert super in "normalen" Klassen.
Jetzt wollte ich mein Telefon innerhalb eines TThread Createn aber wenn ich Telefon := TTelefon.Create(TComponent(Form_Main), Server, User, Pass); (Mit .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!
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Create(TComponent) innerhalb eines TThreads aufrufen

  Alt 24. Nov 2021, 07:19
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
MorrisF

Registriert seit: 3. Apr 2019
41 Beiträge
 
#3

AW: Create(TComponent) innerhalb eines TThreads aufrufen

  Alt 24. Nov 2021, 08:02
Oke also muss ich meinem Thread quasi Form_Main mitgeben?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Create(TComponent) innerhalb eines TThreads aufrufen

  Alt 24. Nov 2021, 08:17
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Create(TComponent) innerhalb eines TThreads aufrufen

  Alt 24. Nov 2021, 09:24
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.
Oke also muss ich meinem Thread quasi Form_Main mitgeben?
Nein. Ich schrieb doch was fehlt, eine WndProc-Schleife
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
MorrisF

Registriert seit: 3. Apr 2019
41 Beiträge
 
#6

AW: Create(TComponent) innerhalb eines TThreads aufrufen

  Alt 25. Nov 2021, 09:49
Ich weiß leider nicht, was eine WndProc-Schleife ist... habe auch null Erfahrung damit...
Könnt ihr mir ein Beispiel geben?
  Mit Zitat antworten Zitat
MorrisF

Registriert seit: 3. Apr 2019
41 Beiträge
 
#7

AW: Create(TComponent) innerhalb eines TThreads aufrufen

  Alt 25. Nov 2021, 10:31
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.051 Beiträge
 
Delphi 12 Athens
 
#8

AW: Create(TComponent) innerhalb eines TThreads aufrufen

  Alt 25. Nov 2021, 10:34
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Create(TComponent) innerhalb eines TThreads aufrufen

  Alt 25. Nov 2021, 12:56
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
Gruß vom KodeZwerg

Geändert von KodeZwerg (25. Nov 2021 um 13:07 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:42 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