0

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

4

1 回答 1

2

TIdTCPClient跨线程边界工作得很好,您所要做的就是创建一个实例并序列化对它的访问,以便多个线程不能同时发送消息并意外地相互重叠。

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

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

于 2013-08-15T01:24:24.803 回答