我正在使用 TIdTCPServer 和 TIdTCPClient 组件将 Windows 服务与 VCL 应用程序通信(发送日志),一切正常,但由于服务是多线程的,每次我发送日志(消息字符串)对于 VCL 应用程序,我需要在服务中创建组件 (TIdTCPClient) 的新实例。TIdTCPClient
所以问题是我如何才能避免这种情况并在 Windows 服务端 只使用组件的一个唯一实例 ?
问问题
196 次
1 回答
2
TIdTCPClient
跨线程边界工作得很好,您所要做的就是创建一个实例并序列化对它的访问,以便多个线程不能同时发送消息并意外地相互重叠。
我建议将其TIdTCPClient
移至其自己的专用线程,该线程监视连接状态并在服务器关闭、重新启动等情况下自动重新连接。让您的工作线程将消息放入线程安全队列,例如TIdThreadSafeStringList
, 然后TIdTCPClient
定期检查队列并根据需要发送。这样,您的工作线程不会TIdTCPClient
直接访问,并且在连接断开时,它仍然可以收集消息以在重新建立连接时发送。
在应用程序方面,如果它一次只能从服务接受 1 个连接,那么使用TIdTCPServer
可能有点矫枉过正。您可以考虑TIdSimpleServer
改用。
于 2013-08-15T01:24:24.803 回答