分享

如何在IDTCPServer.OnExecute中判断AThread已断线?

 容心居 2020-03-22

帖子aKnightChen » 星期六, 2006年7月8日 14:19


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这种方法将第二行保护起来,可冶标不能冶本。

如何在IDTCPServer.OnExecute中判断AThread已断线?

帖子aKnightChen » 星期六, 2006年7月8日 14:20


注:OVER_USER_COUNT 是一个常量

如何在IDTCPServer.OnExecute中判断AThread已断线?

帖子webwx » 星期六, 2006年7月8日 14:26


线程在执行的时候有异步执行和OnTerminated事件以及Terminated属性。
你使用了Terminated属性,那要有相对应的Terminate过程才行呢。
DemoThread.Execute;
var
 i: Integer;
begin
 for i := 0 to 3000 do Sleep (100);
 Terminate;  
end;
要想更安全的控制线程,你可以看看关于这方面的线程互斥,信号灯,临界区,事件啊。

如何在IDTCPServer.OnExecute中判断AThread已断线?

帖子aKnightChen » 星期六, 2006年7月8日 15:08


webwx,首先谢谢你!
但你说的这个问题我也明白,
情景是这样子:
 我在本机上运行一个server,一个Client程序,
 双方连接好后,我Ctrl+Del+Alt将Client关闭,
 此时,在Server端,依然是连线状态:
 ------------------------------
 AThread.Terminated=false
 AThread.Connection.Connected=true
 ------------------------------
 以至于程序继续执行,从而出错。

 我想在OnExecute事件中判断出来,可没法子。。。[?]

如何在IDTCPServer.OnExecute中判断AThread已断线?

帖子webwx » 星期六, 2006年7月8日 15:17


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

如何在IDTCPServer.OnExecute中判断AThread已断线?

帖子aKnightChen » 星期六, 2006年7月8日 15:22


To: webwx
终于被你看到我问题的点子了,[只怪我没将问题表达清楚]

但是:当我进入调试模式下看时,
却发现当客户端断线时,依然是先执行 OnExecute事件,然后再去执行 OnDisconnect 事件
====》这就是问题的根源,所以我才到处找方法在OnExecute事件中判断是否断线。

如何在IDTCPServer.OnExecute中判断AThread已断线?

帖子aKnightChen » 星期六, 2006年7月8日 15:25


开发第一个Indy程序,真累。希望大家拉我一把。我会努力尝试你们说的各种方法!
先谢谢啦!

如何在IDTCPServer.OnExecute中判断AThread已断线?

帖子webwx » 星期六, 2006年7月8日 15:41


这就对了 呵呵 你不用去考虑出错的问题啊。 服务端自然用Disconnection事件来处理就可以了。这两个控件,服务端的有那几个事件也够了啊。Connected时是有线程句柄的。那就不用再另外保存了。 呵呵。 利用服务端的连接线程进行查找方式或是轮询方式来发送数据;正如前面说的,客服端开放一个线程来处理定时接收的,可以放时间短点,然后再开线程来出来接受信息。当然你想完善的话,可以用到线程池技术 呵呵。

如何在IDTCPServer.OnExecute中判断AThread已断线?

帖子smokingroom » 星期六, 2006年7月8日 15:51


很简单,在判断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;

如何在IDTCPServer.OnExecute中判断AThread已断线?

帖子aKnightChen » 星期六, 2006年7月8日 16:02


AThread.Connection.CheckForDisconnect(False,False);
这种方法还是不行,无法取得ATread的正确状态。

服务器在OnExecute中运行已断线的AThread时,依然无法判断。
以至出弹出一个异常。[虽然也没啥大事,但我心里不踏实,想彻底解决这个问题]

如何在IDTCPServer.OnExecute中判断AThread已断线?

帖子aKnightChen » 星期日, 2006年7月9日 19:05


自已顶一下,要是再过一天没结果,我就老老实实结贴!

如何在IDTCPServer.OnExecute中判断AThread已断线?

帖子aKnightChen » 星期一, 2006年7月10日 11:52


算了,结了吧。[平分]
上面的方法都不起作用,我还是用忽略这个异常提示吧。(TRY。。。EXCEPT。。END)

如何在IDTCPServer.OnExecute中判断AThread已断线?

帖子aKnightChen » 星期一, 2006年7月10日 11:53


D

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多