冻结 Indy HTTP。进入 Android Delphi 11 内部线程

Posted

技术标签:

【中文标题】冻结 Indy HTTP。进入 Android Delphi 11 内部线程【英文标题】:Freezing Indy HTTP. Get on Android Delphi 11 inside thread 【发布时间】:2022-01-18 11:35:27 【问题描述】:

我最近从 Delph 10.2 迁移到 Delphi 11。 基于此代码,我会定期在线程内从服务器获取 http。

  myth := TThread.CreateAnonymousThread(
  procedure
    var IdHTTP1:TIdHTTP;
  begin

        ...
        ...
        IdHTTP1:=TIdHTTP.Create();
        IdHTTP1.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) 
          Gecko/20100101Firefox/12.0';
        ...
        ...
        IdHTTP1.Get(Url,ResStm);
        ...
        ...

 end);
 myth.start

此代码在 Delphi 10.2 上运行而没有任何冻结,但在 Delphi 11 上冻结此行 'IdHTTP1.Get(Url,ResStm);'超过 5 秒。

【问题讨论】:

在这里工作正常。您可能想显示正确的minimal reproducible example,因为上面的代码可以正常工作。确保这不是与服务器相关的问题。 如果你给TIdHTTP.ConnectTimeout和/或TIdHTTP.ReadTimeout分配一个ConnectTimeout 仅适用于目标 IP 已知后 TCP 连接的初始建立。 ReadTimeout 仅适用于从 TCP 连接读取数据时。 我的实际代码非常复杂,我为“minimal-reproducible-example”编写了一个经过测试的程序,它没有任何毛躁,但在我的代码中提及行有延迟,当我变暗时行每件事都很好。我提到在 Delphi 10.2 上不会发生冻结,并且在 Delphi 11 上运行程序时没有任何更改的代码会卷曲。 【参考方案1】:

在更新表单内容的同步过程中使用了错误的地方是导致此冻结的原因。

TThread.Synchronize (TThread.CurrentThread,procedure ()
  begin
    ....
    ...
    ...
  end);

通过将此封闭结构限制为一些必要的行,冻结仅限于 毫秒,这并不明显。 例如:我将流的解压放在同步之外。

最后提一下:这种冻结发生在 Delphi 11

【讨论】:

以上是关于冻结 Indy HTTP。进入 Android Delphi 11 内部线程的主要内容,如果未能解决你的问题,请参考以下文章

Indy 10 Http 服务器示例

Android 应用程序在完成活动时冻结,runOnUiThread() 停止工作

TIdHttpServer 在 Windows 更新后 Active 设置为 False 时冻结

当我转到“设置”时,Android Studio会冻结

如何使用 Indy http 或 ipworks http 模拟登录?

delphi 7 下安装 indy 10.5.8 教程