C
chenxi_sh
Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个ClientSocket程序,接受服务端数据进行转换。使用ClBlocking和线程;线程如下:
MySocket:TCustomWinSocket;
TheStream:TWinSocketStream;
constructor TMyThread.create(skt: TCustomWinSocket);
begin
MySocket := skt;
inherited create(false);
end;
procedure TMyThread.Execute;
begin
while not terminateddo
begin
TheStream := TWinSocketStream.Create(MySocket, STMWTIME);
if not MySocket.Connected then
begin
terminate;
exit;
end;
if theStream.WaitForData(STMWTIME) then
begin
if not MySocket.Connected then
begin
terminate;
exit;
end;
end;
//下面是处理Socket收发数据
。。。。。。。。。。。。
end;
ClientSocket的Connect事件
procedure TForm1.SMUpSktConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
TheMyThread := TMyThread.create(Socket);
end;
应用程序关闭、
procedure TForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if TheMyThread<>nil then
TheMyThread.Terminate;
ClientSocket.Close;
end;
出现问题:
当关闭应用程序时,有时会出现Socket ‘句柄无效’之类的错误。我怀疑是当执行完Terminate后,Socket已关闭。而执行Terminate可能要一段时间,线程才能结束。
所以可能是此时正好有一个线程在执行,当执行到Socket时,此时Socket已关闭。所以出现错误。我在Terminate后加上WaitFor后,在Delphi环境下运行好象没有问题。
可是脱离Delphi坏竟后运行,当关闭应用程序时,就出现‘内存只读’、‘应用程序非法’等之类‘的错误。哪位高手能帮我解决,不甚感激。
MySocket:TCustomWinSocket;
TheStream:TWinSocketStream;
constructor TMyThread.create(skt: TCustomWinSocket);
begin
MySocket := skt;
inherited create(false);
end;
procedure TMyThread.Execute;
begin
while not terminateddo
begin
TheStream := TWinSocketStream.Create(MySocket, STMWTIME);
if not MySocket.Connected then
begin
terminate;
exit;
end;
if theStream.WaitForData(STMWTIME) then
begin
if not MySocket.Connected then
begin
terminate;
exit;
end;
end;
//下面是处理Socket收发数据
。。。。。。。。。。。。
end;
ClientSocket的Connect事件
procedure TForm1.SMUpSktConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
TheMyThread := TMyThread.create(Socket);
end;
应用程序关闭、
procedure TForm1.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if TheMyThread<>nil then
TheMyThread.Terminate;
ClientSocket.Close;
end;
出现问题:
当关闭应用程序时,有时会出现Socket ‘句柄无效’之类的错误。我怀疑是当执行完Terminate后,Socket已关闭。而执行Terminate可能要一段时间,线程才能结束。
所以可能是此时正好有一个线程在执行,当执行到Socket时,此时Socket已关闭。所以出现错误。我在Terminate后加上WaitFor后,在Delphi环境下运行好象没有问题。
可是脱离Delphi坏竟后运行,当关闭应用程序时,就出现‘内存只读’、‘应用程序非法’等之类‘的错误。哪位高手能帮我解决,不甚感激。