【发布时间】: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