AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Thread in TIdTCPClient-Klasse
Thema durchsuchen
Ansicht
Themen-Optionen

Thread in TIdTCPClient-Klasse

Offene Frage von "meierotto"
Ein Thema von meierotto · begonnen am 9. Aug 2005 · letzter Beitrag vom 23. Sep 2005
Antwort Antwort
meierotto

Registriert seit: 20. Mai 2005
Ort: Cottbus
73 Beiträge
 
Delphi 2005 Professional
 
#1

Thread in TIdTCPClient-Klasse

  Alt 9. Aug 2005, 15:00
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.
Kann mir vielleicht jemand einen guten Tipp geben?
Lass nie die Lösung eines Problems wichtiger werden als die Liebe zu einem Menschen. (Barbara Johnson)
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Thread in TIdTCPClient-Klasse

  Alt 10. Aug 2005, 14:10
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
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
meierotto

Registriert seit: 20. Mai 2005
Ort: Cottbus
73 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Thread in TIdTCPClient-Klasse

  Alt 10. Aug 2005, 14:39
Danke, danke,

werd ich gleich mal so probieren
  Mit Zitat antworten Zitat
meierotto

Registriert seit: 20. Mai 2005
Ort: Cottbus
73 Beiträge
 
Delphi 2005 Professional
 
#4

Re: Thread in TIdTCPClient-Klasse

  Alt 22. Sep 2005, 15:19
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

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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

Re: Thread in TIdTCPClient-Klasse

  Alt 22. Sep 2005, 15:25
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
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#6

Re: Thread in TIdTCPClient-Klasse

  Alt 22. Sep 2005, 15:33
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;
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
meierotto

Registriert seit: 20. Mai 2005
Ort: Cottbus
73 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Thread in TIdTCPClient-Klasse

  Alt 23. Sep 2005, 09:16
Vielen Dank für eure Hinweise und Hilfestellungen,

ein paar Fragen tun sich mir aber noch auf :

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?

...
Lass nie die Lösung eines Problems wichtiger werden als die Liebe zu einem Menschen. (Barbara Johnson)
  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 04:22 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