【发布时间】:2011-05-14 02:58:47
【问题描述】:
我有一个连接,我给了 20 秒的超时时间(慢速链接)。我需要允许我的用户取消此连接调用。
我已经在线程中进行了连接,这样我就可以让 GUI 继续运行,但是我如何告诉 Indy 取消呢?我还必须从主线程调用取消,因为连接调用被阻止。这可能吗?
这适用于 C++ Builder,但 Delphi 的答案就可以了。
【问题讨论】:
标签: delphi c++builder indy
我有一个连接,我给了 20 秒的超时时间(慢速链接)。我需要允许我的用户取消此连接调用。
我已经在线程中进行了连接,这样我就可以让 GUI 继续运行,但是我如何告诉 Indy 取消呢?我还必须从主线程调用取消,因为连接调用被阻止。这可能吗?
这适用于 C++ Builder,但 Delphi 的答案就可以了。
【问题讨论】:
标签: delphi c++builder indy
中止 Connect() 的唯一方法是从与调用 Connect() 的线程上下文不同的线程上下文中调用 Disconnect()。在这种情况下,您的主线程可以直接调用 Disconnect(),然后您的线程可以处理 Connect() 作为回复引发的异常。
【讨论】:
也许另一种方法是创建自己的 TIdAntiFreeze 后代,如果客户端想要退出,则会在它的 Process() 方法中抛出错误,这将中止连接尝试,然后您可以捕获此特定错误并做出相应的响应。
创建 TIdAntiFreeze 组件后,连接例程应该会找到它。您可以使用 IdleTimeout 属性对其进行微调,该属性是调用 DoProcess() 方法的频率。
或者,创建一个您自己的 IOHandler,它使用 TIdConnectThread,就像这个 AntiFreeze 代码一样,并更优雅地处理错误。
【讨论】: