Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Thread in TIdTCPClient-Klasse (https://www.delphipraxis.net/51268-thread-tidtcpclient-klasse.html)

meierotto 9. Aug 2005 14:00


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?

chaosben 10. Aug 2005 13:10

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

meierotto 10. Aug 2005 13:39

Re: Thread in TIdTCPClient-Klasse
 
Danke, danke,

werd ich gleich mal so probieren :)

meierotto 22. Sep 2005 14:19

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:

Zacherl 22. Sep 2005 14:25

Re: Thread in TIdTCPClient-Klasse
 
Mal ein Beispiel:

Delphi-Quellcode:
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;
Florian

ste_ett 22. Sep 2005 14:33

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;

meierotto 23. Sep 2005 08:16

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:
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;
Ich erwähnte schon, dass ich mit Threads noch nicht viel gemacht habe? :oops:

...


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:28 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