【问题标题】:can you interrupt an Indy connect call?你能打断 Indy 连接通话吗?
【发布时间】:2011-05-14 02:58:47
【问题描述】:

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

我已经在线程中进行了连接,这样我就可以让 GUI 继续运行,但是我如何告诉 Indy 取消呢?我还必须从主线程调用取消,因为连接调用被阻止。这可能吗?

这适用于 C++ Builder,但 Delphi 的答案就可以了。

【问题讨论】:

    标签: delphi c++builder indy


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      也许另一种方法是创建自己的 TIdAntiFreeze 后代,如果客户端想要退出,则会在它的 Process() 方法中抛出错误,这将中止连接尝试,然后您可以捕获此特定错误并做出相应的响应。

      创建 TIdAntiFreeze 组件后,连接例程应该会找到它。您可以使用 IdleTimeout 属性对其进行微调,该属性是调用 DoProcess() 方法的频率。

      或者,创建一个您自己的 IOHandler,它使用 TIdConnectThread,就像这个 AntiFreeze 代码一样,并更优雅地处理错误。

      【讨论】:

      • 如果在工作线程的上下文中调用 Connect(),则派生自定义 TIdAntiFreeze 组件将不起作用。当 I/O 操作在主线程上下文之外执行时,Indy 专门忽略 TIdAntiFreeze 对象。这是因为 TIdAntiFreezeBase.ShouldUse() 方法是在调用 Process() 之前调用的,而 ShouldUse() 会检查调用线程的 ID,因为它不是虚拟的,所以不能被覆盖。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      • 2012-07-02
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      相关资源
      最近更新 更多