Delphi-PRAXiS
Seite 3 von 5     123 45      

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)

Spurius 26. Nov 2003 05:51

Re: Thread Anfängerfrage
 
Hallo,
ich hab das Buch nicht, kannst du mir nicht einfach sagen, wie das geht?
Thx
Spurius

choose 26. Nov 2003 08:25

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.

Spurius 26. Nov 2003 12:48

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

choose 26. Nov 2003 13:42

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.

Spurius 26. Nov 2003 16:22

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:
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;
das ist der anfang. vielleicht kann ich damit mein problem verdeutlichen.
Gruß
Spurius

choose 26. Nov 2003 16:41

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]

Spurius 26. Nov 2003 17:13

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:
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.
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?
Gruß
Spurius

Kamil 26. Nov 2003 17:24

Re: Thread Anfängerfrage
 
Schau dir nochmal das was ich geschrieben habe an. Das sollte dir helfen.

Spurius 26. Nov 2003 17:52

Re: Thread Anfängerfrage
 
Jetzt hab ich aber mit viel Mühe den Thread hinbekommen, und würde den gern weiterverwenden.
Trotzdem Danke
Spurius

Kamil 26. Nov 2003 17:58

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.
Seite 3 von 5     123 45      

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