Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Prgramm hängt trotz Thread. (https://www.delphipraxis.net/138805-prgramm-haengt-trotz-thread.html)

Deltachaos 17. Aug 2009 22:54


Prgramm hängt trotz Thread.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.
Ich habe ein Problem und zwar habe ich volgenden Code:

Delphi-Quellcode:
unit uMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, mtTelnetThread;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    Telnet : TTelnetThread;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Telnet := TTelnetThread.create;
  Telnet.Connect('xtain.net', 1338);
end;

end.
Der Tread:
Delphi-Quellcode:
UNIT mTTelnetThread;

interface

uses
  classes,
  sysUtils,
  Dialogs;

type
     public
        constructor create; virtual;
        function Connect(Host: String; Port: Integer): boolean; virtual;

   end;

implementation

constructor TTelnetThread.create;
begin
  inherited create(true);
  freeOnTerminate := true;
end;


function TTelnetThread.Connect(Host: String; Port: Integer): boolean;
begin
  sleep(9999999);
end;
Nunja das Problem ist klar das Das Programm troz eigenem tread hängt. Hat wer ne Idee?

[edit=Luckie]Rechtschreibfehler im Titel korrigiert. Mfg, Luckie[/edit]
[edit=mkinzler]Rechtschreibfehler konsequent im Titel korrigiert :zwinker: Mfg, mkinzler[/edit]

Muetze1 17. Aug 2009 23:06

Re: Prgramm hängt troz Tread.
 
Du hast keinen Thread sondern du rufst ja Sleep direkt auf. Das was in einem TThread Nachfahren parallel abläuft ist alles was in der Methode Execute drin steht. Und diese muss überschrieben werden - mal abgesehen von anderen Unzulänglichkeiten in deinen kleinen Codeschnipseln...

Deltachaos 18. Aug 2009 00:28

Re: Prgramm hängt troz Tread.
 
Also ich habe das ganze mal so gemacht wie su sagtest.
für einen Sleep funktioniert das sogar.
Das problem ist das ich damit eigentlich eine Telnetverbindung herstellen möchte ohne das bei offner verbindung das formular hängt.

wenn ich das also so mache hängt das form:

Delphi-Quellcode:
procedure TTelnetThread.execute;
begin
  IdTelnet1.Host := Host;
  IdTelnet1.Port := Port;
  try
    IdTelnet1.Connect();
//    IsConnect := True;
  except
//    IsConnect := False;
  end;
end;
Ne idee?

Verbindung kommt aber beim Server an ;)
Wenn ich dann Disconnecte dann läst sich das Form auch wieder bewegen

Die Muhkuh 18. Aug 2009 00:30

Re: Prgramm hängt troz Tread.
 
Zeig mal kompletten Code.

sx2008 18. Aug 2009 01:16

Re: Prgramm hängt troz Tread.
 
Zitat:

Zitat von Deltachaos
Das problem ist das ich damit eigentlich eine Telnetverbindung herstellen möchte ohne das bei offner verbindung das formular hängt.

Also: ein Formular soll erzeugt werden und sichtbar werden.
*Danach* soll eine Telnet-Verbindung gestartet werden und während dieser Zeit soll eine Sanduhr angezeigt werden,
damit der Benutzer weiss, dass das Programm noch arbeitet.

Um dieses Verhalten zu erreichen brauchst du keinen Thread!
Leider hat ein Formular nicht das Event OnAfterShow.
Aber dem kann man nachhelfen.
Falls ich dich überzeugt habe, dass ein Thread hier nicht angebracht ist, kriegst du mehr Infos dazu.

Deltachaos 18. Aug 2009 10:03

Re: Prgramm hängt troz Tread.
 
Die Telnetverbindung soll aber den ganzen Programmablauf über geöffnet sein.
Solange dies der Fall ist hängt das Formular.
Hier der ganze Code:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Telnet := TTelnetThread.create;
  Telnet.SetVars('xtain.net', 3118);
  Telnet.Resume;
 
  //Telnet.Disconnect;
  //Telnet.Resume;
end;
Der Thread:
Delphi-Quellcode:
UNIT mTTelnetThread;

interface

uses
  classes,
  sysUtils,
  windows,
  Dialogs,
  IdBaseComponent,
  IdComponent,
  IdTCPConnection,
  IdTCPClient,
  IdTelnet;

type
   TTelnetThread = CLASS(TThread)
     private
       IdTelnet1: TIdTelnet;
       Host: String;
       Port: Integer;

     protected
        procedure execute; override;

     public
        constructor create; virtual;
        procedure Disconnect; virtual;
        procedure Send(Value: String); virtual;
        procedure SetVars(fHost: String; fPort: Integer); virtual;
   end;

implementation


constructor TTelnetThread.create;
begin
  inherited create(true);
  freeOnTerminate := true;
  IdTelnet1 := TIdTelnet.Create(nil);
end;

procedure TTelnetThread.execute;
begin
  IdTelnet1.Host := Host;
  IdTelnet1.Port := Port;
  try
    IdTelnet1.Connect();
//    IsConnect := True;
  except
//    IsConnect := False;
  end;
end;

procedure TTelnetThread.Send(Value: String);
begin
  IdTelnet1.WriteLn(Value);
end;

procedure TTelnetThread.SetVars(fHost: String; fPort: Integer);
begin
  Host := fHost;
  Port := fPort;
end;

procedure TTelnetThread.Disconnect;
begin
  IdTelnet1.Disconnect();
end;



end.

Luckie 18. Aug 2009 10:06

Re: Prgramm hängt troz Tread.
 
Nebenbei bemerkt, das Ding nett sich Thread und nicht Tread.

Deltachaos 18. Aug 2009 10:08

Re: Prgramm hängt troz Thread.
 
ohhh,
xD

himitsu 18. Aug 2009 10:09

Re: Prgramm hängt troz Thread.
 
abgesehn davon ist der Thread so total sinnlos, da abgesehn vom dTelnet1.Connect(); alles außerhalb des Threads abläuft, welcher sich sogar nach dem Connect sofort wieder beendet.

und bezüglich dem String über SetVar ... Strings sind nicht threadsicher, also sollte man den String nicht einfach so in einen Thread hineinreichen.

Deltachaos 18. Aug 2009 10:12

Re: Prgramm hängt troz Thread.
 
ähm ja gut.
Die Frage ist erstmal wie erreiche ich es das bei einer Offenen Telnet Verbindung das Main Form nicht hängt

PS: Gibt es iwo ne Gutes Tut für Threads. Ich arbeite nich noch nich solange damit.

Klaus01 18. Aug 2009 10:23

Re: Prgramm hängt troz Thread.
 
soweit ich das weiß benutzt doch die TidTelnet Komponente von Hause aus Threads.
Oder man kann sie so konfigurieren das sie es tut.
Es ist also in keinster Weise notwendig Deine Telnet Session in einen eigenen Thread auszulagern.

Ausserdem ist Telnet Ereignis gesteuert.
Du kannst Daten im Ereignis OnDataAvailable auslesen.


Btw. welche Indy Version nutz Du?

Grüße
Klaus

Deltachaos 18. Aug 2009 10:32

Re: Prgramm hängt troz Thread.
 
Ahh es hat sich erledigt :P
Man musste nur die Option TreadesEvent auf true stellen

himitsu 18. Aug 2009 10:34

Re: Prgramm hängt troz Thread.
 
also so dürfte alles im Thread ablaufen ... glaub ich :angel2:
Delphi-Quellcode:
UNIT mTTelnetThread;

interface

uses
  Classes,
  SysUtils,
  Windows,
  Dialogs,
  SyncObjs,
  IdBaseComponent,
  IdComponent,
  IdTCPConnection,
  IdTCPClient,
  IdTelnet;

type
   TTelnetThread = CLASS(TThread)
     private
       FHost: String;
       FPort: Integer;
       FTelnet: TIdTelnet;
       FCSection: TCriticalSection;
       FSend: String;
     protected
       procedure Execute; override;
     public
       constructor Create(const Host: String; Port: Integer);
       destructor Destroy; override;
       procedure Send(Value: String);
   end;

implementation

constructor TTelnetThread.Create(const Host: String; Port: Integer);
begin
  inherited Create(true);
  FHost := Host;
  FPort := Port;
  FSend := '';
  UniqueString(FHost);
  FTelnet := TIdTelnet.Create(nil);
  FTelnet.Host := FHost;
  FTelnet.Port := FPort;
  FCSection := TCriticalSection.Create;
  Resume;
end;

destructor TTelnetThread.Destroy;
begin
  FCSection.Free;
  FTelnet.Free;
end;

procedure TTelnetThread.Execute;
var
  S: String;
begin
  FTelnet.Connect;
  repeat
    FCSection.Enter;
    try
      S := FSend;
      FSend := '';
    finally
      FCSection.Leave;
    end;
    if S <> '' then
      FTelnet.WriteLn(S)
    else Sleep(50); // CPU-Last im Leerlauf senken
  until Terminated;
  FTelnet.Disconnect;
end;

procedure TTelnetThread.Send(Value: String);
begin
  while Value <> '' do
  begin
    FCSection.Enter;
    try
      if FSend = '' then
      begin
        FSend := Value;
        UniqueString(FSend);
        Value := '';
      else Sleep(50); // CPU-Last der Schleife senken
    finally
      FCSection.Leave;
    end;
  end;
end;

end.


Delphi-Quellcode:
Telnet := TTelnetThread.Create('xtain.net', 3118);

...
Telnet.Send('...');


...
Telnet.Terminate;
aber wenn es (so wie Klaus01 meint) auch ohne Thread geht, dann würde ich es auch ohne machen.

Tutorials ... da finden sich unmassen an Threads in der DP und soweit ich weiß, steht sehr viel in der OH und Delphi hat sogar eine Threaddemo mit an Board.

Mithrandir 18. Aug 2009 11:20

Re: Prgramm hängt troz Thread.
 
Zitat:

Zitat von Deltachaos
[edit=Luckie]Rechtschreibfehler im Titel korrigiert. Mfg, Luckie[/edit]

Dann aber auch konsequent, bitte. ;)

Zitat:

Prgramm hängt trotz Thread.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:45 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