AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread Anfängerfrage

Ein Thema von Spurius · begonnen am 22. Nov 2003 · letzter Beitrag vom 27. Nov 2003
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#11

Re: Thread Anfängerfrage

  Alt 22. Nov 2003, 16:01
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
gruß, choose
  Mit Zitat antworten Zitat
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#12

Re: Thread Anfängerfrage

  Alt 22. Nov 2003, 16:32
Hallo,
ja ich verwende tidtcpclient, aber wenn ich im thread

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

Gruß
Spurius
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#13

Re: Thread Anfängerfrage

  Alt 22. Nov 2003, 16:58
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.
gruß, choose
  Mit Zitat antworten Zitat
Kamil

Registriert seit: 16. Aug 2002
178 Beiträge
 
#14

Re: Thread Anfängerfrage

  Alt 22. Nov 2003, 19:34
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;
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#15

Re: Thread Anfängerfrage

  Alt 22. Nov 2003, 19:45
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 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 client.ReadLn; auch durch das Einbinden der Form-Unit nicht funktioniert...
gruß, choose
  Mit Zitat antworten Zitat
Kamil

Registriert seit: 16. Aug 2002
178 Beiträge
 
#16

Re: Thread Anfängerfrage

  Alt 22. Nov 2003, 20:00
@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.
  Mit Zitat antworten Zitat
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#17

Re: Thread Anfängerfrage

  Alt 25. Nov 2003, 15:57
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
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#18

Re: Thread Anfängerfrage

  Alt 25. Nov 2003, 19:43
Hallo Spurius,

löse das Problem so, wie Du dem unbekannten Typ TMemo und TidTCPClient innerhalb des Deklaration von TMyThread begegnet bist.
gruß, choose
  Mit Zitat antworten Zitat
Spurius

Registriert seit: 19. Aug 2003
294 Beiträge
 
Delphi 7 Professional
 
#19

Re: Thread Anfängerfrage

  Alt 25. Nov 2003, 21:22
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
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#20

Re: Thread Anfängerfrage

  Alt 25. Nov 2003, 23:27
Such mal in der OH. Dort habe ich zB das gefunden
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.
gruß, choose
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 5     12 34     Letzte »    


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 14: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