如何终止所有活动连接并停止IdTCPServer?印地10

时间:2018-11-13 18:44:09

标签: delphi indy10

开放式连接 IdTCPServer.Active:= false; 使程序挂起。 如何终止所有活动连接并停止IdTCPServer? 我正在尝试执行以下操作:

dt.Rows[i]["ColumnName"].ToString();
dt.Rows[i][ColumnInteger].ToString();

1 个答案:

答案 0 :(得分:2)

  

打开连接时,IdTCPServer.Active:= false;导致程序挂起。

唯一的可能方法是死锁服务器。

如果您在服务器的事件处理程序与主UI线程同时同步同步的同时从主UI线程的上下文中停用服务器(TIdSyncTThread.Synchronize()SendMessage()等。

如果您的客户端线程执行的操作不是线程安全的,例如在没有适当同步的情况下访问UI,也会发生这种情况。

停用服务器将关闭所有活动套接字,并等待其线程终止。但是,如果一个或多个客户端线程在主UI线程上等待被阻塞,或者在其他情况下被死锁,而主UI线程在等待服务器停用时被阻塞,则这是一个死锁,使程序挂起。 >

要解决此问题,您需要确保服务器代码是线程安全的,并且您必须:

  • 使用异步同步(TIdNotifyTThread.Queue()PostMessage()等),这样客户端线程就不会在等待主UI线程时被阻塞

  • 从辅助线程中停用服务器,以便主UI线程可以自由地正常处理同步请求。