procedure TReadThread.Execute; begin inherited; repeat sRecv := socket.ReadString(1024); //recv
if sRecv <> '' then SendMessage(hMain.............); until sRecv = ''; end;
Try Except要加上比较好的说
procedure TReadThread.Execute; var i:integer; s:string; begin try while (Terminated=false) and (IdTCPClient1.Connected=true) do begin i:=IdTCPClient1.ReadFromStack(); //检查是否需要读取数据 if i>0 then begin s:=IdTCPClient1.ReadString(i);//读取数据 end; SleepEx(100,true); end; //loop except end; end;
zhuangbx220(星)的方法应该可以了:)
使用下面的方法脱离IDE运行不会抛出异常了。 procedure TReadThread.Execute; begin inherited; try repeat sRecv := socket.ReadString(1024); //recv if sRecv <> '' then SendMessage(hMain.............); until sRecv = ''; except on E:Exception do; end;end; 当然通过设置Tools->Debugger Options->Language Exceptions 的Stop on Delphi Exceptions选项取消在IDE运行也一样。
其实之所以出错,是线程不能正常退出的原因。而INDY是阻塞的,服务器端的readln是线程里的代码,又一直停在那里,服务器直接退出的话,线程不能正常退出,所以出错。 所以,在server的线程里接收,要先判断线程是不是退出或连接是否成功,即 while not terminate or IdTCPClient.Connected=ture do begin //接收代码 end;正常退出的原则是:客户端发退出信号,并退出---服务器接到退出信号,断开连接。当关闭服务器时,可以先发送一个退出命令给客户端,客户端执行上述操作。最后再关闭服务器。
在IDE上调试的时候,Try Except默认都会由IDE提示的!
脱离IDE单独运行才行,或者IDE的选项设置为:由程序管理Exception自己研究一下Delphi的设置选项吧
begin
inherited;
repeat
sRecv := socket.ReadString(1024); //recv
if sRecv <> '' then
SendMessage(hMain.............);
until sRecv = '';
end;
var i:integer;
s:string;
begin
try
while (Terminated=false) and (IdTCPClient1.Connected=true) do
begin
i:=IdTCPClient1.ReadFromStack(); //检查是否需要读取数据
if i>0 then
begin
s:=IdTCPClient1.ReadString(i);//读取数据
end;
SleepEx(100,true);
end; //loop
except
end;
end;
procedure TReadThread.Execute;
begin
inherited;
try
repeat
sRecv := socket.ReadString(1024); //recv
if sRecv <> '' then
SendMessage(hMain.............);
until sRecv = '';
except
on E:Exception do;
end;end;
当然通过设置Tools->Debugger Options->Language Exceptions 的Stop on Delphi Exceptions选项取消在IDE运行也一样。
所以,在server的线程里接收,要先判断线程是不是退出或连接是否成功,即
while not terminate or IdTCPClient.Connected=ture do
begin
//接收代码
end;正常退出的原则是:客户端发退出信号,并退出---服务器接到退出信号,断开连接。当关闭服务器时,可以先发送一个退出命令给客户端,客户端执行上述操作。最后再关闭服务器。