【问题标题】:Delphi/Indy multithreading ServerDelphi/Indy 多线程服务器
【发布时间】:2020-01-10 17:16:23
【问题描述】:

我正在尝试将我的应用程序变为多线程。我想要实现的是: - 通过 TidHTTPServer 接收命令 - 执行本地操作(可能涉及使用 tidHTTP 向其他服务发送/接收数据) - 将执行结果返回给原调用者

由于我对多线程还很陌生,所以我想知道我的设计理念是否正确

  1. TMsgHandler=Class(TThread)
  2. 在 TidHTTPServer.OnCommandGet 我创建一个新的 TMsgHandler 实例并传递 ARequestInfo 和 AResponseInfo
  3. TMsgHandler.Excecute 解释数据
  4. TMsgHandler.Execeute 能否在我的 Main 中使用 Objects(TidHTTP 的后代)与其他服务进行通信?
  5. TMsgHandler 通过 AResponseInfo 发送应答并终止。

这行得通吗?

【问题讨论】:

    标签: multithreading delphi indy


    【解决方案1】:

    这不是正确的设计。

    THTTPServer 是一个多线程组件。它的OnCommand... 事件在 Indy 为您创建的工作线程上下文中触发。

    因此,您不需要从TThread 派生您的TMsgHandler。而是直接在OnCommand... 线程的上下文中执行您的TIdHTTP。在您的事件处理程序退出之前,不会将响应发送回客户端(除非您手动发送)。但是,您不应该从主线程共享单个 TIdHTTP(除非您绝对需要,在这种情况下您需要同步对它的访问)。您应该根据需要直接在您的OnCommand.../TMsgHandler 代码中动态创建一个新的TIdHTTP

    【讨论】:

    • 好的,谢谢。由于我正在访问的服务需要 OAuth 我想在开始时初始化连接并使用那些经过身份验证的套接字... :-/ 我当然可以将令牌从 OnCommand 传递到线程中...谢谢开始指导。我会看看我的结局。 :-)
    • @WolfgangBures 您至少可以将TIdHTTP 对象池化并根据需要将它们分发给OnCommand... 线程,然后在完成后将它们放回池中。只要确保池是线程安全的。
    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 2017-02-15
    • 1970-01-01
    • 2012-10-29
    • 2010-10-20
    • 1970-01-01
    • 2016-07-02
    • 2012-04-11
    相关资源
    最近更新 更多