首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于Delphi中TcpServer和TcpClient的一些有关问题

2012-03-03 
关于Delphi中TcpServer和TcpClient的一些问题我写了一个服务器和客户端应用程序(TcpServer和TcpClient),下

关于Delphi中TcpServer和TcpClient的一些问题
我写了一个服务器和客户端应用程序(TcpServer和TcpClient),下面是TcpServer.OnAccept函数,我主要想把参数ClientSocket传递给自己创建的线程类中的成员变量socket,在线程中跟客户端进行通信,可是是在执行TMyThread类的Execute进行数据读取时出现了错误

procedure TForm1.TcpServerAccept(Sender: TObject;
  ClientSocket: TCustomIpClient);
var
  dataThread:TMyThread;
begin
  dataThread:=TMyThread.Create(false);
end;

下面是我定义的TMyThread类
unit MyThread;

interface

uses
  Classes,Sockets,Dialogs;

type
  TMyThread = class(TThread)
  public
  Socket:TCustomIpClient;
  command:String;
  constructor Create(ClientSocket:TCustomIpClient;SuspendedOnCreate:boolean); overload;
  destructor Destroy;override;
  private
  { Private declarations }
  protected
  procedure Execute; override;
  end;

implementation

constructor TMyThread.Create(ClientSocket:TCustomIpClient;SuspendedOnCreate:boolean);
begin
  Inherited Create(SuspendedOnCreate);
  FreeOnTerminate:=true;
  Priority:=tpNormal;
  Socket:=TCustomIpClient.Create(nil);
  socket:=ClientSocket;
end;

destructor TMyThread.Destroy;
begin
  Socket.Free;
  inherited destroy;
end;


procedure TMyThread.Execute;
var
  data:String;
begin
  data:=socket.Receiveln;
  showMessage(data);
end;


end.
 


[解决办法]
dataThread:=TMyThread.Create(false); //创建的时候就开始执行线程了,但是你线程构造函数里面
是先创建好线程此时线程已经开始运行,这个时候调用Socket肯定会出错,Inherited Create(SuspendedOnCreate); 
FreeOnTerminate:=true; 
Priority:=tpNormal; 
Socket:=TCustomIpClient.Create(nil); 
socket:=ClientSocket; 

解决办法:要么把线程构造函数中Socket创建的位置提前,或者先把线程挂起,等构造好了,然后再唤醒,试试。

热点排行