我正在使用TIdTCPServer和TIdTCPClient组件将Windows服务与VCL应用程序通信(发送日志),一切正常,但由于服务是多线程的,每次我发送日志(a消息字符串)到VCL应用程序我需要在服务中创建组件的新实例(TIdTCPClient)。所以问题是如何避免这种情况,并且在wiundows服务方面只使用TIdTCPClient
组件的一个唯一实例?
答案 0 :(得分:2)
TIdTCPClient
在线程边界上运行得很好,你所要做的就是创建一个单独的实例并对其进行序列化访问,以便多个线程不能在同一时间发送消息并且意外地相互重叠。
我建议将TIdTCPClient
移动到自己的专用线程,该线程监视连接状态,如果服务器出现故障,重新启动等,可以自动重新连接。让工作线程将消息放入线程中 - 安全队列,例如TIdThreadSafeStringList
,然后让TIdTCPClient
定期检查该队列并根据需要发送它。这样,您的工作线程不直接访问TIdTCPClient
,并且在连接断开的时候,它仍然可以在重新建立连接时收集要发送的消息。
在应用程序方面,如果它一次只能接受来自服务的1个连接,那么使用TIdTCPServer
可能有点矫枉过正。您可以考虑使用TIdSimpleServer
代替。