![]() |
Thread in TIdTCPClient-Klasse
Hallo,
ich hab mich grad völlig in einem Problem festgefahren: von TIdTCPClient habe ich eine Klasse abgeleitet. Darin gibt es eine Prozedur Query, welche auf einem bestimmten Server eine zeitintensive Abfrage startet. Das funktioniert soweit auch, nur ist dann natürlich meine Anwendung blockiert. Deshalb wollte ich es jetzt mit einem Thread versuchen. D.h. es soll zusätzlich zu der Procedure Query eine Procedure ThreadQuery geben, welche das gleiche als Thread ausführt. Ich muss allerdings zugeben, noch nicht viel mit Threads gemacht zu haben, deshalb kann schon in meinem Ansatz der Fehler liegen. :oops: Kann mir vielleicht jemand einen guten Tipp geben? |
Re: Thread in TIdTCPClient-Klasse
Nun ja ich würde das so machen:
Als erstes baust du dir einen Query-Klasse. Diese beinhaltet ein TCPClient-Object von dir. Dazu kommen ein paar Funktionen, damit man das TCPClient-Objekt benutzen kann. So, und jetzt wirds interessant: Du brauchst jetzt noch eine 2. Klasse (TQueryThread), abgeleitet von TThread. Diese neue Klasse brauch ihr eigenes TCPClient-Objekt (wichtig! nicht das obige übergeben!) Und in die Execute - Prozedur machst du dann den Query-Aufruf von deinem TCPClient. Und nu kommt noch der finale Schritt: Die obige Query-Klasse bekommt eine Objekt vom Typ TQueryThread zugeteilt und die zugehörige public-Funktion "ThreadQuery". Und voila: damit hast du 2 getrennt Query-Möglichkeiten |
Re: Thread in TIdTCPClient-Klasse
Danke, danke,
werd ich gleich mal so probieren :) |
Re: Thread in TIdTCPClient-Klasse
Es ist schon ein Weilchen her, aber ich setze trotzdem nochmal fort...
Ich habs noch nicht zum laufen bekommen. Bitte helft mir, wenn ich vielleicht nur einen Denkfehler mache :wall: Wenn ich das so mache, wie chaosben es vorgeschlagen hat, müsste ich den TCPClient des TQueryThread ebenfalls mit dem Server verbinden und einloggen, und das jedesmal, wenn ich eine Query starte. Das würde das System aber stark bremsen. Ideal wäre z.B., wenn ich lediglich das TCPClient.Readln (stoppt das System enorm) in einem Thread laufen lassen könnte ohne mich mehrmals einloggen zu müssen. Vielen Dank für eure Geduld :roll: |
Re: Thread in TIdTCPClient-Klasse
Mal ein Beispiel:
Delphi-Quellcode:
Florian
type TOwnTCPClient = class(TIdTCPClient)
[...] procedure DoQuery; [...] end; type TQueryThread = class(TThread) procedure Execute; override; //so ähnlich zumindest end; [...] procedure TQueryThread.Execute; begin InternalTCP.Query; end; procedure TOwnTCPClient.DoQuery; var QT: TQueryThread; begin QT := TQueryThread.Create; QT.Execute; end; |
Re: Thread in TIdTCPClient-Klasse
Die Variable für den Thread sollte als private Klassenvariable deklariert werden, da sie sonst nur in dem Methode zur Verfügung steht. :)
Delphi-Quellcode:
type TOwnTCPClient = class(TIdTCPClient)
[...] procedure DoQuery; [...] end; type TQueryThread = class(TThread) private QT: TQueryThread; public procedure Execute; override; //so ähnlich zumindest constructor Create; destructor Destroy; override; end; [...] constructor TQueryThread.Create; begin QT := TQueryThread.Create(true); // suspended end; destructor TQueryThread.Destroy; begin QT.Free; end; procedure TQueryThread.Execute; begin InternalTCP.Query; end; procedure TOwnTCPClient.DoQuery; begin QT.Resume; end; |
Re: Thread in TIdTCPClient-Klasse
Vielen Dank für eure Hinweise und Hilfestellungen,
ein paar Fragen tun sich mir aber noch auf :gruebel: :
Delphi-Quellcode:
Ich erwähnte schon, dass ich mit Threads noch nicht viel gemacht habe? :oops:
type TOwnTCPClient = class(TIdTCPClient)
[...] procedure DoQuery; //müsste hier nicht class procedure DoQuery definiert sein, //um mit dem TQueryThread darauf zugreifen zu können? [...] end; type TQueryThread = class(TThread) private QT: TQueryThread; //Ist das so richtig? [...] end; [...] constructor TQueryThread.Create; begin QT := TQueryThread.Create(true); // suspended=True kann hier nicht übergeben werden end; procedure TQueryThread.Execute; begin InternalTCP.Query; //InternalTCP? Was verbirgt sich dahinter? end; procedure TOwnTCPClient.DoQuery; begin QT.Resume; //Wie kann TOwnTCPClient darauf zugreifen? end; ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 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