Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.171 Beiträge
 
Delphi 12 Athens
 
#13

Re: Prgramm hängt troz Thread.

  Alt 18. Aug 2009, 10:34
also so dürfte alles im Thread ablaufen ... glaub ich
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat