2

我有一个 Delphi 2006 应用程序,它收集数据并将其显示为许多通道的摘要,TDrawGrid 上每行一个通道。我在网络上的各种其他 PC 上运行相同的应用程序,但这些其他 PC 是从属设备 - 它们不收集数据,而只是提供摘要的远程显示。

目前,slave 只是在 master 上显示一个摘要显示屏幕的模拟,这是通过来自 master 的 mailslot 的广播方式实现的。

我想以不同的方式实现这一点,以减少主机的负载,并为从机提供更多的灵活性和独立性,以了解它们如何解释数据。此外,我对跨子网数据的邮槽广播有问题。

我可以使用一些共享内存方案将数据放置到内存映射文件中,奴隶可以从任何地方(甚至通过网络)访问吗?我们谈论的是最大 100k 字节的内存大小,例如,由 master 以大约每秒一次的速度更新,可能在一个线程中,以保持 master 前台任务的响应。

4

5 回答 5

4

共享内存不能在网络上工作(除非你运行 VPN),而且它在一般网络上也不能很好地工作(视图可以去同步,你不能在网络上同步它们)。

我可以看到您的任务的几种解决方案:

选项 1. 使用面向消息的中间件 (MOM),例如 MSMQ、kbmMW、我们的 MsgConnect 来广播仅包含数据更改的通知。这样客户端就不需要额外轮询服务器以获取数据快照。所有 MOM 解决方案都使用 TCP 连接进行操作,这比邮槽更可靠。

选项 2. 使用一些客户端-服务器 DBMS,可能是支持通知客户端的 DBMS(我不是 DMBS 专家,所以我不能告诉你名称)。

于 2010-10-01T15:06:53.920 回答
2

您可以使用数据库,例如 DISAM、Firebird 等。对于 DISAM,我使用了读取数据库文件的前 8 个字节的技巧,这似乎是一个标题。如果它改变了,我知道表中的数据已经改变,否则它没有。如果您使用轮询循环,或者如果您想继续使用邮槽作为通知方法,您可以在客户端中使用它。即每 10 秒或在邮件槽通知时轮询文件,以先到者为准。

于 2010-10-01T14:58:03.787 回答
2

使用 TCP/IP 有什么问题?您可以使用Indy(已经与 Delphi 一起提供)或ICS让您的主(主)应用程序使用一个或两个线程响应 IP 请求(例如,HTTP 或 ICMP 或任何适合您的数据需求),并拥有“从" 应用程序只需通过特定端口上主设备的 IP 地址请求数据。这将在 Intranet 上或通过 Internet 透明地工作。

于 2010-10-01T17:47:49.663 回答
2

最简单的方法是使用共享上的文件,主服务器写入而从服务器仅读取。如果您想防止“脏读”,则可能需要某种同步。另一方面,这可能无关紧要,具体取决于您要显示的数据类型。

使用简单文件的优点是它不需要遵循 KISS 原则的任何附加软件(例如数据库服务器或某些中间件)。但当然它远非性感 ;-) 并且没有使用正确的流行语技术。

于 2010-10-01T18:20:29.600 回答
0

我们将 MSMQ 用于类似的事情。

于 2010-10-01T15:03:54.613 回答