![]() |
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 ;) |
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 |
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. |
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; |
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:
Delphi-Quellcode:
auch durch das Einbinden der Form-Unit nicht funktioniert...
client.ReadLn;
|
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.
|
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:
kann ich aber keinen Thread erzeugen. da kommt dann unbekannt tmythread.
Self.FThread:= TMyThread.Create(Self.Client1, Self.Memo1);
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 |
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. |
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 |
Re: Thread Anfängerfrage
Such mal in der OH. Dort habe ich zB das gefunden
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:56 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