我写了一个服务器和客户端应用程序(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.
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.
是先创建好线程此时线程已经开始运行,这个时候调用Socket肯定会出错,Inherited Create(SuspendedOnCreate);
FreeOnTerminate:=true;
Priority:=tpNormal;
Socket:=TCustomIpClient.Create(nil);
socket:=ClientSocket; 解决办法:要么把线程构造函数中Socket创建的位置提前,或者先把线程挂起,等构造好了,然后再唤醒,试试。