你可以中断Indy连接调用吗?

3

我有一个连接,我给它20秒的超时时间(慢速链接)。我需要允许用户取消此连接调用。

我已经将连接放在线程中以保持GUI运行,但如何告诉Indy取消连接?由于连接调用被阻塞,我还必须从主线程调用取消。这可能吗?

这是针对C++ Builder的问题,但Delphi的答案也可以。

2个回答

8

唯一中止Connect()的方法是从不同于调用Connect()的线程上下文中调用Disconnect()。在这种情况下,您的主线程可以直接调用Disconnect(),然后您的线程可以处理Connect()引发的异常。


0
也许另一种方法是创建你自己的TIdAntiFreeze继承类,在其Process()方法中,如果客户端想要退出则抛出错误,这将中止连接尝试,然后你可以捕获这个特定的错误并做出相应的响应。
一旦你创建了一个TIdAntiFreeze组件,连接例程应该能够找到它。你可以通过IdleTimeout属性微调它,该属性控制DoProcess()方法被调用的频率。
或者,创建一个使用TIdConnectThread的自定义IOHandler,就像这个AntiFreeze代码所做的那样,并更优雅地处理错误。

1
如果在工作线程的上下文中调用Connect(),则派生自定义的TIdAntiFreeze组件将无效。当I/O操作在主线程的上下文之外执行时,Indy会特别忽略TIdAntiFreeze对象。这是因为在调用Process()之前会先调用TIdAntiFreezeBase.ShouldUse()方法,并且ShouldUse()方法会检查调用线程的ID,由于该方法不是虚拟的,因此无法覆盖。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接