加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:12:53 所属栏目:大数据 来源:网络整理
导读:我想从互联网上下载一个文件,我想这应该是一个简单的任务.尝试了几种不同的方法,我发现每种方法都有自己的缺点. 主要问题是: 应用程序冻结,直到下载文件为止 如果Internet连接丢失/服务器没有响应,应用程序将永久冻结. (细节: How to retrieve a file from
我想从互联网上下载一个文件,我想这应该是一个简单的任务.尝试了几种不同的方法,我发现每种方法都有自己的缺点.
主要问题是:

>应用程序冻结,直到下载文件为止
>如果Internet连接丢失/服务器没有响应,应用程序将永久冻结.

(细节:

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

所以,最后我使用了我从几个人那里得到的建议来使用像Indy这样的“专业”库.但是,Indy并没有比我尝试过的代码要好得多(但它更大,更难维护).使用Indy时,应用程序不会仅在短时间内冻结,因此它仍然(某种程度上)可用.但是,在下载完成之前无法关闭应用程序(从不会因为Internet连接中断而关闭).

其他人报告了同样的问题: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并回到最初在单独的线程中下载文件的想法,并在它没有响应时结束线程(至少这样我摆脱了第三方库)?如果我这样做会有不可预见的副作用吗?

使用:Delphi 7,Indy 10.1.5 10.5(可能).

谢谢

解决方法

解决这些问题并不困难.您要做的第一件事是确保您已正确处理错误处理.如果出现故障,请确保一切正常清理.除此之外,请确保下载代码是单独线程的一部分.如果有任何问题,您可以随时终止主程序中的线程.这是代码(仅用于下载,而不是线程),对我来说工作正常.
with TDownloadURL.Create(nil) do
  try
    URL := 'myurltodownload.com';
    filename := 'locationtosaveto';
    try
      ExecuteTarget(nil);
    except
      result := false;
    end;
    if not FileExists(filename) then
      result := false;
  finally
    clear;
    free;
  end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读