代码之家  ›  专栏  ›  技术社区  ›  Gregor Brandt

你能打断Indy connect的电话吗?

  •  3
  • Gregor Brandt  · 技术社区  · 15 年前

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

    我已经在一个线程中进行了连接,这样我就可以保持GUI正常运行,但是如何告诉Indy取消?我还必须从主线程调用cancel,因为connect调用被阻塞。这可能吗?

    这是C++Builder,但是Delphi的回答会很好。

    2 回复  |  直到 15 年前
        1
  •  8
  •   Remy Lebeau    15 年前

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

        2
  •  0
  •   Darian Miller    15 年前

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

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

    或者,创建一个自己的IOHandler,它使用一个TIdConnectThread,就像这个防冻代码那样,可以更优雅地处理错误。