Delphi/Indy multithreading Server
我正在尝试将我的应用设置为多线程。我想要实现的是:
-通过TidHTTPServer接收命令
-执行本地操作(可能涉及使用tidHTTP向其他服务发送/接收数据)
-将执行结果返回给原始调用方
由于我对多线程还很陌生,所以我想知道我的设计思想是否正确
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。
- 好的谢谢。由于我要访问的服务需要OAuth,因此我想在开始时初始化连接并使用那些经过身份验证的套接字...:-/当然,我可以将令牌从OnCommand传递到线程中...谢谢你入门指南。我将看到最终结果。 :-)
-
@WolfgangBures至少可以将TIdHTTP对象池化,并根据需要将它们分发给OnCommand...线程,然后在完成后将它们放回池中。只要确保池是线程安全的即可。