如何在IDTCPServer.OnExecute中判断AThread已断线?(50分)

  • 主题发起人 主题发起人 aKnightChen
  • 开始时间 开始时间
A

aKnightChen

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.IDTCPServer1Execute(AThread: TIdPeerThread);
begin
//判断AThread是否终止或断线...可是好像没什么作用,当客户断线时,依然会继续执行
if AThread.Terminated or (not AThread.Connection.Connected) then Exit;
//由于断线,程序继续执行,所以在下一行WriteLn就,就弹出错误来
//具体错误:EIdSocketError with message Socket Error
AThread.Connection.WriteLn(OVER_USER_COUNT);
end;

我该如何在正确判断AThread是否断线呢?
注:用try...except...end这种方法将第二行保护起来,可冶标不能冶本。
 
注:OVER_USER_COUNT 是一个常量
 
线程在执行的时候有异步执行和OnTerminated事件以及Terminated属性。
你使用了Terminated属性,那要有相对应的Terminate过程才行呢。
DemoThread.Execute;
var
i: Integer;
begin
for i := 0 to 3000 do Sleep(100);
Terminate;
end;
要想更安全的控制线程,你可以看看关于这方面的线程互斥,信号灯,临界区,事件啊。
 
webwx,首先谢谢你!
但你说的这个问题我也明白,
情景是这样子:
我在本机上运行一个server,一个Client程序,
双方连接好后,我Ctrl+Del+Alt将Client关闭,
此时,在Server端,依然是连线状态:
------------------------------
AThread.Terminated=false
AThread.Connection.Connected=true
------------------------------
以至于程序继续执行,从而出错。

我想在OnExecute事件中判断出来,可没法子。。。[?]
 
我大概明白你说的事情吧。呵呵。你想实现Server&Client的多线程交互对不对吧?
你加的Ctrl+Del+Alt是非法关闭程序了。 所有客服端Execute没有执行。我想你用的IDTCPServer,IDTCPClient我没有用过。&Socket的原理一样嘛? 在连接错误的时候或是连接断开的时候是否有事件。这样你就可以判断了。如果不行 我给你提供个笨笨办法吧。就是设置线程似的心跳。你非法退出程序了 这里一定不会出发客服端的。所有你又贴出来了怎样&客服端与服务端进行交互对不? 呵呵
 
To: webwx
终于被你看到我问题的点子了,[只怪我没将问题表达清楚]

但是:当我进入调试模式下看时,
却发现当客户端断线时,依然是先执行 OnExecute事件,然后再去执行 OnDisconnect 事件
====》这就是问题的根源,所以我才到处找方法在OnExecute事件中判断是否断线。
 
开发第一个Indy程序,真累。希望大家拉我一把。我会努力尝试你们说的各种方法!
先谢谢啦!
 
这就对了 呵呵 你不用去考虑出错的问题啊。 服务端自然用Disconnection事件来处理就可以了。这两个控件,服务端的有那几个事件也够了啊。Connected时是有线程句柄的。那就不用再另外保存了。 呵呵。 利用服务端的连接线程进行查找方式或是轮询方式来发送数据;正如前面说的,客服端开放一个线程来处理定时接收的,可以放时间短点,然后再开线程来出来接受信息。当然你想完善的话,可以用到线程池技术 呵呵。
 
很简单,在判断AThread.Connection.Connected之前,调用CheckForDisconnect,
注:不同版本Indy,CheckForDisconnect方法的参数可能不同
procedure TForm1.IDTCPServer1Execute(AThread: TIdPeerThread);
begin
AThread.Connection.CheckForDisconnect(False,False);
if AThread.Terminated or (not AThread.Connection.Connected) then Exit;
AThread.Connection.WriteLn(OVER_USER_COUNT);
end;
 
AThread.Connection.CheckForDisconnect(False,False);
这种方法还是不行,无法取得ATread的正确状态。

服务器在OnExecute中运行已断线的AThread时,依然无法判断。
以至出弹出一个异常。[虽然也没啥大事,但我心里不踏实,想彻底解决这个问题]
 
自已顶一下,要是再过一天没结果,我就老老实实结贴!
 
算了,结了吧。[平分]
上面的方法都不起作用,我还是用忽略这个异常提示吧。(TRY。。。EXCEPT。。END)
 
后退
顶部