Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread Anfängerfrage (https://www.delphipraxis.net/12179-thread-anfaengerfrage.html)

choose 22. Nov 2003 16:01

Re: Thread Anfängerfrage
 
Hallo Spurius,

das hängt davon ab, was Du verwendest. Ich denke, dass Du mit TMemo und zB TidTCPClient oä arbeitest? Im zweifelsfall kann Du ads im OI nachsehen, sofern sich die Komponenten in einer Form befinden.
Bitte lies auch in der Hilfe zu der Klient-Komponete, die Du verwendest, ob sie Threadsicher (nicht nur -fähig!) ist, andernfalls müsstest Du die Aufrufe dieser Komponete ebenfalls synchronisieren...
Alles halb so wild ;)

Spurius 22. Nov 2003 16:32

Re: Thread Anfängerfrage
 
Hallo,
ja ich verwende tidtcpclient, aber wenn ich im thread

client: tidtcpclient; schreibe, kommt die meldung, dass das unbekannt sei

Gruß
Spurius

choose 22. Nov 2003 16:58

Re: Thread Anfängerfrage
 
Sinngemäß aus der OH: Du kannst nur Typen verwenden, die zuvor deklariert wurden.

In Deinem Fall ist die Klasse TidTCPClient in einer Indy-Unit deklariert, die Du einbinden musst. Bei der Arbeit mit Formularen geschieht dies beim Platzieren einer Komponente auf einer Form oder einem Datenmodul automatisch. Wirf mal einen Blick in den uses-Abschnitt der Unit Deiner Formular-Klasse.

Kamil 22. Nov 2003 19:34

Re: Thread Anfängerfrage
 
Hi,
der Vorschlag von Choose wird zwar funktionieren, aber er ist meiner Meinung nicht so gut.
Ich würde es so machen:
Nur für den Zugriff auf TMemo und ähnliche Komponenten Synchronize verwenden, da dieser Code im Mainthread ausgeführt wird. (nur das notwendigste mit synchronize ausführen)
Dein TIdTCPClient sollte zum Thread gehören (d.h. im Thread erstellen, initalisieren und am Ende freigeben), damit er im Thread arbeiten kann und nicht im Mainthread arbeiten muss. Wenn du (fast) alles im Mainthread ausführst, dann kannst du dir den zweiten Thread gleich sparen...


Ungefähr so würde ich es machen:
Delphi-Quellcode:
type
  TMyThreadClass = class(TThread)
  private
    FClient : TSomeClient;
    FMemo : TSomeVCLControl;
    procedure UpdateMemo;
  protected
    s: string;
    procedure Execute;override;
  public
    constructor Create(Host: string; Port: integer; const AMemo: TSomeVCLControl);
  end;


constructor TMyThreadClass.Create(Host: string; Port: integer; const AMemo: TSomeVCLControl);
begin
  inherited Create(True);
  Assert(Assigned(AMemo));

  FClient:= TIdTCPClient.Create(nil);
  FClient.Host:=Host;
  FClient.Port:=Port;
  //copy references to member vars
  FMemo:= AMemo;
  //start thread
  Resume;
end;

procedure TMyThreadClass.Execute;
begin
  try
    FClient.Connect;
    while (not Terminated) and (FClient.Connected) do
    begin
      s:=FClient.Readln;
      Synchronize(UpdateMemo);
    end;
  finally
    FClient.Free;
  end;
end;

procedure TMyThreadClass.UpdateMemo;
begin
  //will be executed within the mainthread
  FMemo.Lines.Append(s);
end;

choose 22. Nov 2003 19:45

Re: Thread Anfängerfrage
 
Hallo Kamil,

es ist sicherlich eleganter (Geheinmisprinzip, Zuständigkeitsprinzip), wenn alles, was die Connection betrifft, nur innerhalb des Threads abgehandelt wird. Das ist auch der Gedanke meiner Bemerkung in den Klammern gewesen:
Zitat:

Zitat von choose
Der Thread bekommt die Referenzen auf die zu verwendenen Objekte übergeben und verwendet sie dort (besser noch: die Connection (FClient ist nur ihm bekannt)

Allerdings wollte ich zunächst auf das Problem der Sichtbarkeit aufmerksam machen und erklären, warum
Delphi-Quellcode:
client.ReadLn;
auch durch das Einbinden der Form-Unit nicht funktioniert...

Kamil 22. Nov 2003 20:00

Re: Thread Anfängerfrage
 
@choose: muss zugeben, dass ich deinen Beitrag nur schnell überflogen und die Klammer deshalb übersehen habe. Hab mich mehr auf den Quellcode konzentriert. Da der Titel "Thread Anfängerfrage" lautet dachte ich, dass sowas erwähnt werden sollte. Deshalb wird auch der Unterschied zwischen threadsicher und threadfähig wahrscheinlich noch nicht ganz klar sein und die Anweisund "if FClient.HasData then" im Thread kann ganz schnell zu größeren Problemen führen, weil sie höchst wahrscheinlich auch synchronisiert werden sollte.

Spurius 25. Nov 2003 15:57

Re: Thread Anfängerfrage
 
So, ich meld mich mal wieder.
ich hab jetzt die threadunit fertig, und habe sie unter uses eingebunden, wo auch windows, sysutils etc. stehen.
Mit
Code:
Self.FThread:= TMyThread.Create(Self.Client1, Self.Memo1);
kann ich aber keinen Thread erzeugen. da kommt dann unbekannt tmythread.
und wenn ich unter var, wo auch form : tform1 deklariert wird,
fthread: tmythread deklarieren will kommt auch dass tmythread unbekannt sind.
kann mir da jemand wieterhelfen?
Thx
Spurius

choose 25. Nov 2003 19:43

Re: Thread Anfängerfrage
 
Hallo Spurius,

löse das Problem so, wie Du dem unbekannten Typ TMemo und TidTCPClient innerhalb des Deklaration von TMyThread begegnet bist.

Spurius 25. Nov 2003 21:22

Re: Thread Anfängerfrage
 
da hab ich idtcpclient unter uses deklariert. mein thread heisst mythread, und die unit thread. soll ich da thread + mythread deklarieren oder wie?
ich blick da nicht so ganz durch, wär nett, wenn du mir weiterhelfen würdest.
Gruß
Spurius

choose 25. Nov 2003 23:27

Re: Thread Anfängerfrage
 
Such mal in der OH. Dort habe ich zB das gefunden
Zitat:

Zitat von OH
[...]A uses clause need include only units used directly by the program or unit in which the clause appears. That is, if unit A references constants, types, variables, procedures, or functions that are declared in unit B, then A must use B explicitly.[...]

Das Verwenden von Units ist unter Delphi ein elementares Prinzip und wird in dem D7 beiliegenden Buch "Sprachreferenz" gut beschrieben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 Uhr.
Seite 2 von 5     12 34     Letzte »    

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