紧急求助--解决这种奇怪的线程问题(100分)

  • 主题发起人 主题发起人 chenxi_sh
  • 开始时间 开始时间
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坏竟后运行,当关闭应用程序时,就出现‘内存只读’、‘应用程序非法’等之类‘的错误。哪位高手能帮我解决,不甚感激。
 
在Close事件中:
先关闭Close,在终止线程。因为当TWinSocketStream执行Free时,如果Socket没有Close,
就会发生‘内存只读’等错误
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部