【问题标题】:How to turn my Delphi Class (from idHTTP) into a "Thread"?如何将我的 Delphi 类(来自 idHTTP)变成“线程”?
【发布时间】:2020-01-19 13:30:24
【问题描述】:

我写了一个 idHTTP 的后代来实现我自己的各种 web 服务的通信类。

TidHTTP
|
TWebAPI
|
TWebOAuthAPI
|
TSpotifyAPI

现在这一切似乎都如我所愿,我 - 当然 - 经历了互联网的延迟,因此在我的应用程序中“挂起”,因为他们等待 idHTTP 的超时。 所以想法是将我的类变成一个单独的线程,这样至少主程序不会停止。我该怎么办?

我应该将 WebAPI 变成 TThread 的后代并在其中有一个 TidHTTP 对象,还是稍后有一个使用 TSpotifyAPI 对象的包装器??

感谢这方面的任何提示 :-)

【问题讨论】:

  • Indy 组件库已经具备一些多线程能力。所以我建议你首先检查一下它是如何使用现有的 Indy-s 多线程实现来完成的。这样做的原因是您的自定义组件可能已经与 Indy-s 多线程功能兼容。如果你没有在你的组件中引入任何线程不安全的代码,那是不正常的。
  • 你不需要从 TThread 派生。
  • 我不认为TIdHTTP 是为了派生而设计的。尽管TIdHTTP 不是密封类,但在这种情况下您应该更喜欢composition over inheritance
  • @WolfgangBures 我不建议将线程放在TIdHTTP 后代中,而只是在线程中使用TIdHTTP。也许有一天您决定更改要使用的 HTTP 库,然后您可以轻松地将 TIdHTTP 替换为其他内容,而不会破坏您的代码。 HTTP 应被视为组件内部工作的实现细节,而不是其余代码必须遵守的接口协定。
  • 如果你想在 Spotify 类中做一些异步处理,你应该使用一些带有回调函数的“异步”方法在调用完成时处理数据。在内部,您可以使用单线程,但也可以使用 Delphi 的 TTask(当您有较新版本时)。 TTask 的优势在于它是自动池化的。

标签: multithreading delphi


【解决方案1】:

如果您在创建Thread 时遵循正常规则,则可以创建TThread 后代并在内部使用 TIdHttp 组件没有问题。

有一段时间我做了一个类来使用包含 TidHttp 组件的线程下载图像而没有问题。

  {: Clase para descargar una imagen y almacenarla en disco.}
  {: Class to download a image and save it to disk}
  TDownImageThread = class(TThread)
  private
    FURLImage: string;
    FPathImage: string;
    FFileNameImage: string;
    // Internas
    ImageName: string;
    PathURL: string;
    // Componente
    idH:TidHTTP;
  public
    // redefinir métodos
    constructor  Create(AURL:string; AOutPathImages:string);
    destructor Destroy; override;
    procedure Execute; override;
    {: URL de la imagen a descargar/ URL of the image }
    property URLImage:string read FURLImage write FURLImage;
    {: Path de disco local donde voy a almacenar la imagen/ Local path to save the image}
    property PathImage:string read FPathImage;
    {: Nombre completa (path+Nombre) de la imagen almacenada en disco local/Compete path on local}
    property FileNameImage:string read FFileNameImage;
  end;

发展等于其他线程。
在这种情况下更简单,因为它不包含可视部分,因此您可以避免与同步相关的问题。

【讨论】:

    猜你喜欢
    • 2016-09-04
    • 2015-06-26
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多