如何在Windows服务中使用TIdTCPClient的全局和单个实例进行日志记录?

时间:2013-08-14 22:33:25

标签: delphi delphi-xe2 indy

我正在使用TIdTCPServer和TIdTCPClient组件将Windows服务与VCL应用程序通信(发送日志),一切正常,但由于服务是多线程的,每次我发送日志(a消息字符串)到VCL应用程序我需要在服务中创建组件的新实例(TIdTCPClient)。所以问题是如何避免这种情况,并且在wiundows服务方面只使用TIdTCPClient组件的一个唯一实例?

1 个答案:

答案 0 :(得分:2)

TIdTCPClient在线程边界上运行得很好,你所要做的就是创建一个单独的实例并对其进行序列化访问,以便多个线程不能在同一时间发送消息并且意外地相互重叠。

我建议将TIdTCPClient移动到自己的专用线程,该线程监视连接状态,如果服务器出现故障,重新启动等,可以自动重新连接。让工作线程将消息放入线程中 - 安全队列,例如TIdThreadSafeStringList,然后让TIdTCPClient定期检查该队列并根据需要发送它。这样,您的工作线程不直接访问TIdTCPClient,并且在连接断开的时候,它仍然可以在重新建立连接时收集要发送的消息。

在应用程序方面,如果它一次只能接受来自服务的1个连接,那么使用TIdTCPServer可能有点矫枉过正。您可以考虑使用TIdSimpleServer代替。