紧急求助——解决Socket与线程问题(200分)

E

eChenXi

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 terminated do 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坏竟后运行,当关闭应用程序时,就出现‘内存只读’、‘应用程序非法’等之类‘的错误。哪位高手能帮我解决,不甚感激。
 
应用程序关闭
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ClientSocket.Close;
if TheMyThread<>nil then
TheMyThread.Terminate;
end;

OK?
 
谢谢您的帮助。请教线程里是不是用try finally时,一旦try中出现异常时,脱离delphi环境执行应用程序就
会出现‘内存只读’等之类的错误?
 
线程中当然可以用try finally;
出现上述错误的原因是TheMyThread.Terminate之后使用waitfor
TheMyThread对象可能释放了(FreeOnTerminate属性为真)
 
我没有使用WaitFor,把Finally该为Except就不会出错。比如在一个线程的Execute里:
try
strToInt('aaa')
finally
end;
脱离Delphi环境运行,当创建了这个线程时就会出现'应用程序发生异常,未知的软件异常(0x0eedfade)
位置为0x77eb7e08'错误。真奇怪。
我的那个Socket程序更是奇怪。脱离Delphi环境运行,关闭时有时会出现上面的错误,调试
不出,真急死人。
 
try..finally..end和try..Except..end有一个区别:
try和finally之间的语句出现例外时,将跳到finally..end中执行,但执行完后,例外仍然
被推出,而Except将排除例外.
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
965
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
回复
0
查看
1K
天地弦
顶部