Delphi/Indy 多线程服务器
Delphi/Indy multithreading Server
我正在尝试将我的应用程序变成多线程。我想要实现的是:
- 通过 TidHTTPServer 接收命令
- 执行本地操作(可能涉及使用 tidHTTP 将 send/receive 数据传输到其他服务)
- return执行结果给原调用者
由于我对多线程还很陌生,所以我想知道我的设计理念是否正确
- TMsgHandler=Class(TThread)
- 在 TidHTTPServer.OnCommandGet 我创建了一个新的 TMsgHandler 实例并传递了 ARequestInfo 和 AResponseInfo
- TMsgHandler.Excecute 解释数据
- 可以 TMsgHandler.Execeute 在我的 Main 中使用对象(TidHTTP 的后代)与其他服务通信吗?
- TMsgHandler 通过 AResponseInfo 发送应答并终止。
这行得通吗?
这不是正确的设计。
THTTPServer
是一个多线程组件。它的 OnCommand...
事件在 Indy 为您创建的工作线程的上下文中触发。
因此,您不需要从 TThread
中导出 TMsgHandler
。改为直接在 OnCommand...
线程的上下文中执行 TIdHTTP
。在您的事件处理程序退出之前,不会将响应发送回客户端(除非您手动发送)。但是,您不应该从主线程共享单个 TIdHTTP
(除非您绝对需要,在这种情况下您需要同步访问它)。您应该根据需要直接在 OnCommand...
/TMsgHandler
代码中动态创建一个新的 TIdHTTP
。
我正在尝试将我的应用程序变成多线程。我想要实现的是: - 通过 TidHTTPServer 接收命令 - 执行本地操作(可能涉及使用 tidHTTP 将 send/receive 数据传输到其他服务) - return执行结果给原调用者
由于我对多线程还很陌生,所以我想知道我的设计理念是否正确
- TMsgHandler=Class(TThread)
- 在 TidHTTPServer.OnCommandGet 我创建了一个新的 TMsgHandler 实例并传递了 ARequestInfo 和 AResponseInfo
- TMsgHandler.Excecute 解释数据
- 可以 TMsgHandler.Execeute 在我的 Main 中使用对象(TidHTTP 的后代)与其他服务通信吗?
- TMsgHandler 通过 AResponseInfo 发送应答并终止。
这行得通吗?
这不是正确的设计。
THTTPServer
是一个多线程组件。它的 OnCommand...
事件在 Indy 为您创建的工作线程的上下文中触发。
因此,您不需要从 TThread
中导出 TMsgHandler
。改为直接在 OnCommand...
线程的上下文中执行 TIdHTTP
。在您的事件处理程序退出之前,不会将响应发送回客户端(除非您手动发送)。但是,您不应该从主线程共享单个 TIdHTTP
(除非您绝对需要,在这种情况下您需要同步访问它)。您应该根据需要直接在 OnCommand...
/TMsgHandler
代码中动态创建一个新的 TIdHTTP
。