TIdTCPClient在线程中调用ReadString时,便一直阻塞在那,这时如果关闭主程序,delphi的IDE就会报出一个错误,如果去掉这个异常?(这个异常用try except是没用的)或者是有没有办法让它退出阻塞状态?
解决方案 »
- 新建个程序,然后关闭,重开~就打不开了~
- 老问题,delphi如何通过ip远程访问sqlserver。
- 为什么listbox最后多出一个数
- 三方控件使用(DsnStage,DsnRegister,DsnSelect)
- 判断SQL Server 中的 image字段
- 请高手看看这是怎么回事?
- image类型问题
- 为什么ADOConnection 的数据库连接提供者没有 OLE DB For sQL server?
- 求VSS6.0的下载地址
- 谁能讲下异常机制呢?书也看了,不过我感觉还是有点问题?
- 如何判别ADO连接的数据库的连接是成功的,在线等待?最好有代码或例程.
- 狐狸小鸭玉米过河问题(图形图像编程)
在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;正常退出的原则是:客户端发退出信号,并退出---服务器接到退出信号,断开连接。当关闭服务器时,可以先发送一个退出命令给客户端,客户端执行上述操作。最后再关闭服务器。