我写了一个服务器和客户端应用程序(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;interfaceuses
  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;implementationconstructor 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.
 

解决方案 »

  1.   

    dataThread:=TMyThread.Create(false);  //创建的时候就开始执行线程了,但是你线程构造函数里面
      是先创建好线程此时线程已经开始运行,这个时候调用Socket肯定会出错,Inherited Create(SuspendedOnCreate); 
      FreeOnTerminate:=true; 
      Priority:=tpNormal; 
      Socket:=TCustomIpClient.Create(nil); 
      socket:=ClientSocket; 解决办法:要么把线程构造函数中Socket创建的位置提前,或者先把线程挂起,等构造好了,然后再唤醒,试试。