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已断线?
线程在执行的时候有异步执行和OnTerminated事件以及Terminated属性。 你使用了Terminated属性,那要有相对应的Terminate过程才行呢。 DemoThread.Execute; var i: Integer; begin for i := 0 to 3000 do Sleep (100); Terminate; end; 要想更安全的控制线程,你可以看看关于这方面的线程互斥,信号灯,临界区,事件啊。 如何在IDTCPServer.OnExecute中判断AThread已断线?
webwx,首先谢谢你! 但你说的这个问题我也明白, 情景是这样子: 我在本机上运行一个server,一个Client程序, 双方连接好后,我Ctrl+Del+Alt将Client关闭, 此时,在Server端,依然是连线状态: ------------------------------ AThread.Terminated=false AThread.Connection.Connected=true ------------------------------ 以至于程序继续执行,从而出错。 我想在OnExecute事件中判断出来,可没法子。。。[?] 如何在IDTCPServer.OnExecute中判断AThread已断线?
我大概明白你说的事情吧。呵呵。你想实现Server&Client的多线程交互对不对吧? 你加的Ctrl+Del+Alt是非法关闭程序了。 所有客服端Execute没有执行。我想你用的IDTCPServer,IDTCPClient我没有用过。&Socket的原理一样嘛? 在连接错误的时候或是连接断开的时候是否有事件。这样你就可以判断了。如果不行 我给你提供个笨笨办法吧。就是设置线程似的心跳。你非法退出程序了 这里一定不会出发客服端的。所有你又贴出来了怎样&客服端与服务端进行交互对不? 呵呵 如何在IDTCPServer.OnExecute中判断AThread已断线?
To: webwx 终于被你看到我问题的点子了,[只怪我没将问题表达清楚] 但是:当我进入调试模式下看时, 却发现当客户端断线时,依然是先执行 OnExecute事件,然后再去执行 OnDisconnect 事件 ====》这就是问题的根源,所以我才到处找方法在OnExecute事件中判断是否断线。 如何在IDTCPServer.OnExecute中判断AThread已断线?
开发第一个Indy程序,真累。希望大家拉我一把。我会努力尝试你们说的各种方法! 先谢谢啦! 如何在IDTCPServer.OnExecute中判断AThread已断线?
这就对了 呵呵 你不用去考虑出错的问题啊。 服务端自然用Disconnection事件来处理就可以了。这两个控件,服务端的有那几个事件也够了啊。Connected时是有线程句柄的。那就不用再另外保存了。 呵呵。 利用服务端的连接线程进行查找方式或是轮询方式来发送数据;正如前面说的,客服端开放一个线程来处理定时接收的,可以放时间短点,然后再开线程来出来接受信息。当然你想完善的话,可以用到线程池技术 呵呵。 如何在IDTCPServer.OnExecute中判断AThread已断线?
很简单,在判断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已断线?
AThread.Connection.CheckForDisconnect(False,False); 这种方法还是不行,无法取得ATread的正确状态。 服务器在OnExecute中运行已断线的AThread时,依然无法判断。 以至出弹出一个异常。[虽然也没啥大事,但我心里不踏实,想彻底解决这个问题] 如何在IDTCPServer.OnExecute中判断AThread已断线?
自已顶一下,要是再过一天没结果,我就老老实实结贴! 如何在IDTCPServer.OnExecute中判断AThread已断线?
算了,结了吧。[平分] 上面的方法都不起作用,我还是用忽略这个异常提示吧。(TRY。。。EXCEPT。。END) |
|