gpt4 book ai didi

delphi - 使用 Indy 时连接不会超时

转载 作者:行者123 更新时间:2023-12-03 15:01:40 25 4
gpt4 key购买 nike

我想从互联网下载一个文件,我想这应该是一个简单的任务。尝试了几种不同的方法,我发现每种方法都有其自身的缺点。主要问题是:

  • 应用程序在下载文件之前会卡住
  • 如果互联网连接丢失/服务器不响应,应用程序将永远卡住。

(详情:

How to retrieve a file from Internet via HTTP?
The connection does not timeout while downloading file from internet )

所以,最后我根据几个人的建议来使用“专业”库,例如 Indy。然而,Indy 并不比我尝试过的代码片段好多少(但它要大得多并且难以维护)。使用 Indy 时,应用程序不会仅短暂卡住,因此它仍然(以某种方式)可用。但是,在下载完成之前无法关闭应用程序(如果互联网连接中断则不能关闭)。

其他人报告了同样的问题:http://borland.newsgroups.archived.at/public.delphi.internet.winsock/200609/0609079112.html
https://forums.embarcadero.com/thread.jspa?threadID=25199&tstart=90

那么,我必须对 TIDAntiFreeze 进行一些黑客攻击才能使其正常工作?

此外,ConnectTimeout 属性无法识别。

fIDHTTP := TIDHTTP.Create(NIL);
fIDHTTP.ConnectTimeout:=5000;

我是否应该放弃 Indy 并返回到在单独线程中下载文件的原始想法,并在线程没有响应时结束线程(至少这样我可以摆脱第 3 方库)?如果这样做会产生不可预见的副作用吗?

使用:Delphi 7、Indy 10.1.5 10.5(可能)。

谢谢

最佳答案

您可能需要以 Indy 方式使用 Indy:使用线程。 Indy 专门设计为在阻塞模式下工作,因为这就是大多数互联网协议(protocol)的工作方式(例如:使用 HTTP,在协议(protocol)级别,您发送请求,然后读取响应。您不发送和 同时接收)。 TIdAntiFreeze 应该可以帮助您使用一些 Indy 功能,而无需处理线程;我从未使用过它,因为至少从概念上来说,这是一个丑陋的黑客。

如果您不想处理线程,那么您应该看看 ICS - 它被设计为在异步模式下使用,无需线程。它不需要与 TIdAntiFreeze 等效的功能,因为它不是阻塞的。您开始下载并处理一些事件以获取进度和完成通知。 ICS 与 Indy 一样知名、专业且广泛使用。

关于delphi - 使用 Indy 时连接不会超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3187446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com