![]() |
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:
die Methoden habe ich innerhalb meiner Telefon-Klasse dann neu definiert.
SIP_Client := TSIPclient.Create(aOwner);
SIP_Client.OnRegistration := OnRegistration; SIP_Client.OnCall := OnCall; SIP_Client.OnAnswer := OnAnswer; SIP_Client.OnBye := OnHangup; 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:
Dabei ist
Telefon := TTelefon.Create(Self, Server, User, Pass);
Delphi-Quellcode:
(vom Typ
aOwner
Delphi-Quellcode:
) mein
TComponent
Delphi-Quellcode:
, dass ich im Konstruktor von
Self
Delphi-Quellcode:
mit gebe.
TTelefon
Funktioniert super in "normalen" Klassen. Jetzt wollte ich mein Telefon innerhalb eines
Delphi-Quellcode:
Createn aber wenn ich
TThread
Delphi-Quellcode:
(Mit
Telefon := TTelefon.Create(TComponent(Form_Main), Server, User, Pass);
Delphi-Quellcode:
gehts auch nicht) mache, dann werden die verknüpften Events nicht ausgelöst. Weiß jemand warum?
.Create(TComponent(Self), ...)
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 |
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. |
AW: Create(TComponent) innerhalb eines TThreads aufrufen
Oke also muss ich meinem Thread quasi Form_Main mitgeben?
|
AW: Create(TComponent) innerhalb eines TThreads aufrufen
Zitat:
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. |
AW: Create(TComponent) innerhalb eines TThreads aufrufen
Zitat:
|
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? |
AW: Create(TComponent) innerhalb eines TThreads aufrufen
Also so funktioniert es:
Delphi-Quellcode:
Ist das richtig/schön so? oder kann man da noch was dran feilen?
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; |
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. |
AW: Create(TComponent) innerhalb eines TThreads aufrufen
![]() ![]() ![]() Ü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