我需要在Delphi中开发实时(即,每秒至少请求和接收一次信息)监视应用程序,该应用程序监视多个远程设备(可以是数百个)。通过TCP / IP进行通信。
我正在寻找建议来开发这个应用程序,避免100%的CPU消耗,并尽量减少使用的RAM量。换句话说,我希望我的应用程序保持响应,而不是阻止系统或消耗所有资源。
我主要担心的是使用线程来监控每个远程设备。我的应用程序可以创建的线程数是否有限制?可以使用低优先级或中优先级启动线程以最小化CPU消耗吗?
也欢迎有关最佳内存使用的建议。
答案 0 :(得分:3)
你的直觉是正确的,你想要处理主线程之外的线程中的日志记录。创建一个简单的tcp / ip服务器,为传入连接创建一个新线程并处理那里的日志记录。显然,您需要执行诸如跟踪每个线程以便在服务器应用程序关闭时终止它的事情,并且如果您想要重新使用它们而不是不断创建和销毁它们,则可能实现线程池/队列。但是你所描述的实际上是一个相当简单的服务器应用程序。您可以创建的线程数没有硬性和快速限制。但除非连接保持不变并保持开放,否则你可能会惊讶地发现实际上很少有人同时创建。
答案 1 :(得分:1)
祝你好运。我花了几年的时间来开发一个通用平台来做到这一点。如果您愿意,可以查看它here。至少,您需要使用一些已经非常可靠地运行的通信组件,例如RemObjects。
答案 2 :(得分:1)
我不会为每个设备使用一个线程,我会调查线程是否可以为一个设备池提供服务,或者是否可以使用一个线程池将传入的数据分配给第一个可用的线程。
您可以查看article about process and thread limits in Windows。线程可以具有较低的优先级,但要注意,它们可以被具有较高优先级的线程抢占,并且不能及时读取/写入数据。如果没有任何事情要做,那么太多的线程可能只是“浪费”时间,但是调度程序被迫给它们一些时间(线程应该非常好,以避免仅使用它做什么)。可以并行运行多少个线程而不会严重依赖于可用的硬件。
很大程度上取决于数据的传递方式(拉动或推动?所有数据是否具有相同的优先级?)和读取数据后的过程工作量,以及系统对新数据的反应速度。例如,一个解决方案可能涉及读取数据并将它们排队等待处理,但如果响应时间应短于队列允许的时间,则无法工作。
答案 3 :(得分:1)