![]() |
Re: Thread Anfängerfrage
Hallo,
ich hab das Buch nicht, kannst du mir nicht einfach sagen, wie das geht? Thx Spurius |
Re: Thread Anfängerfrage
Hallo Spurius,
bitte verstehe mich nicht falsch: Ich helfe wirklich gerne. Das Problem ist bei den gegenseitig verwendeten Units aber weniger das Wie für Deine konkrete Problemstellung als das Warum muss man bei der Verwendung von Typen, die in anderen Units deklariert sind, auf diese oder eine andere Weise reagieren. Dies bedarf einer umfassenderen Erklärung statt einem kurzen Statement, mithilfe von drei Zeilen Code, die zudem, wenn an falscher Stelle platziert, unweigerlich vermeidbare Folgefragen nach sich ziehen würden. Es handelt sich beim Einbinden von Units unter Pascal wie Delphi um ein grundlegendes Prinzip, das verstanden werden will und dessen Kenntnis von jeder Bilbiothek von Dritten (zB Komponenten-Suites) vorrausgesetzt wird. Ich halte es deshalb für sinnvoll, das dahinter stehende Prinzip zu erläutern. Diese Thematik ist allerdings in der OH besser und umfassender beschrieben, als ich es hier könnte und sie bietet sich Dir als Informationsquelle an, die Du kurzfristig und zu jeder Zeit befragen kannst. Wenn Du also Dein Begleitmaterial zu Delphi verlegt hast, solltest Du sie stattdessen mit den Stichworten "unit-Klauseln" befragen. Dort findest Du auch Informationen zu dem von Dir entdeckten Prinzip der "zirkulären Unit-Referenzen" sowie dem Thema, dass Du zur Lösung Deines akuten Problem zu benötigen scheinst: "Mehrere und indirekte Unit-Referenzen", dem Abschnitt aus dem ich im letzten Posting zitiert habe und eigentlich schon die Lösung beschreibt. |
Re: Thread Anfängerfrage
Hallo,
also erstmal Danke, dass du mir soviel hilfst. Ich hab mir die uses-klauseln in der Hilfe angeschaut,(ich hab schülerversion, da war kein Handbuch dabei), bin aber nicht schlau daraus geworden, was das für mein Programm bedeutet. Ich habe bisher die Unit, in der der Thread geschrieben ist, unter den uses von meinem Hauptprogramm eingebunden. Aber wie kann ich den darin beschriebenen Thread jetzt einsetzten? Ich versteh das nicht :( Kannst du mir da vielleicht nochmal so ein Musterbeispiel machen, wie du es schonmal gemacht hast? Gruß Spurius |
Re: Thread Anfängerfrage
Hallo Spurius,
wenn ich Deine Antwort richtig interpretiere, ist die Fehlermeldung "Undefinierter Bezeichner" inzwischen verschwunden und Du weißt nichts ganz, wie Du ein Exemplar Deiner Klasse erzeugen kannst. Für ein ähnliches Szenario ist in der D7-OH unter TStringList dann "Verwendung von TStringList" und von dort "Eine neue Stringliste erstellen" beschrieben. Der Text handelt von einem zum Zeitpunkt der Formularerstellung erzeugten Objekt einer Klasse, die man aus dem OI nicht direkt kennt, zeigt die Benutzung zu einem späteren Zeitpunkt und auch, wie man das Objekt wieder freigibt. Achtung: Treads-Objekte sollten vor der Freigabe unbedingt terminiert sein! Falls Du bei diesem Problem angelangt sein solltest, stelle die Frage am besten in einem neuen DP-Tread. |
Re: Thread Anfängerfrage
Hallo,
ich hab mit das mit tstringlist angeschaut, und probiert das nachzumachen. aber es ist ja nicht die thread-unit unbekannt, sondern mythread! hier mal mein code
Delphi-Quellcode:
das ist der anfang. vielleicht kann ich damit mein problem verdeutlichen.
unit modul;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls, ExtCtrls, Mask, ComCtrls, IdTCPServer,threadtest; // <- threadunit type TForm1 = class(TForm) Label1: TLabel; PageControl1: TPageControl; TabSheet1: TTabSheet; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Memo1: TMemo; connect: TButton; Button2: TButton; Edit1: TEdit; ip: TEdit; Port: TEdit; Edit2: TEdit; Button1: TButton; client: TIdTCPClient; Timer1: TTimer; server: TIdTCPServer; TabSheet2: TTabSheet; Label7: TLabel; Label8: TLabel; Label9: TLabel; Memo2: TMemo; serverport: TEdit; servername: TEdit; Button4: TButton; Button5: TButton; Memo3: TMemo; Button3: TButton; procedure connectClick(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure serverConnect(AThread: TIdPeerThread); procedure serverExecute(AThread: TIdPeerThread); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private-Deklarationen } public fthread: tmythread; //hier soll ein neuer thread erstelt werden, aber end; mythread ist unbekannt! var Form1: TForm1; implementation uses thread; {$R *.dfm} procedure TForm1.connectClick(Sender: TObject); begin client.Port := strtoint(port.Text); client.Host := ip.Text; client.Connect; end; procedure TForm1.Button2Click(Sender: TObject); begin client.Writeln(edit2.Text + ': ' + edit1.text); end; procedure TForm1.FormCreate(Sender: TObject); begin memo1.Lines[0] := 'Chatprotokoll'; memo2.lines[0] := 'Chatprotokoll'; memo3.Lines[0] := 'Angemeldete Chatter'; end; Gruß Spurius |
Re: Thread Anfängerfrage
Ist die Klasse tmythread im Interface-Teil der Unit threadtest deklariert?
[edit]Welchen Zweck hat die Unit thread, die Du in der Formular-Unit modul einbindest?[/edit] |
Re: Thread Anfängerfrage
Hallo,
also ich hatte einen thread mythread und nicht Tmythread erstellt. der thread geht jetzt :) aber er friert ein, ich denke das liegt daran, dass es client.hasdata nicht gibt.
Code:
Das ist meine Threadunit. und da der thread sonst immer ausgeführt wird, ist es ja klar, dass das prog einfriert. weisst du, was ich da hinter client einsetzten könnte?
unit threadtest;
interface uses Classes,idtcpclient,dialogs,StdCtrls,sysutils; type tmythread = class(TThread) private fclient:tidtcpclient; fmemo:tmemo; procedure updatememo; protected procedure Execute; override; public constructor create(const aclient: tidtcpclient; const amemo: tmemo); end; implementation uses modul; constructor tmythread.create(const aclient: tidtcpclient; const amemo: tmemo); begin inherited create(true); fclient := aclient; fmemo := amemo; resume; end; procedure tmythread.Execute; begin while not terminated do if fclient. then //<- hasdata ??? synchronize(updatememo) else sleep(100); end; procedure tmythread.updatememo; begin fmemo.Lines.Append(fclient.ReadLn); end; end. Gruß Spurius |
Re: Thread Anfängerfrage
Schau dir nochmal das was ich geschrieben habe an. Das sollte dir helfen.
|
Re: Thread Anfängerfrage
Jetzt hab ich aber mit viel Mühe den Thread hinbekommen, und würde den gern weiterverwenden.
Trotzdem Danke Spurius |
Re: Thread Anfängerfrage
Wenn du deinen Code nicht ändern wirst, dann wird dein Problem natürlich weiterhin bestehen... du muss schon was ändern und soviel ist das auch nicht.
|
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